我正在使用流畅的界面来创建Zend DB Select对象/查询.作为查询的一部分,我想选择一个任意字符串,例如"SELECT'foo'AS'type'FROM ...".foo不是一个列,它只是一个字符串文字.
当我选择任意数字时,查询按预期工作.当我将其更改为字符串时,Zend会尝试将foo视为列,并抛出错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'l.foo' in 'field list'
Run Code Online (Sandbox Code Playgroud)
我尝试以各种方式在Zend_Db_Expr中包装字符串,例如:
$select->columns(array('type' => new Zend_Db_Expr('foo')));
Run Code Online (Sandbox Code Playgroud)
这会阻止Zend添加相关名称,但它仍然将其视为列:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'foo' in 'field list'
Run Code Online (Sandbox Code Playgroud)
我觉得我必须在这里遗漏一些明显的东西.我如何告诉Zend停止将其视为一个列?
我正在尝试使用Zend DB select来执行此查询,但我无法这样做
这是sql查询
select shopping_id,shopping_details,"friend" as type from shopping
请注意我如何指定"朋友"作为类型,而朋友不是购物表中的列.
现在我如何在Zend中做到这一点.我试过这个但它给了我一个错误说"sh.friend Column不存在"
$select->from(array('sh'=>'shopping'),array('shopping_id','shopping_details','"friend" as type');
任何帮助将不胜感激
我正在使用Zend_DB并尝试将charset更改为utf8,这里是代码:
config.ini:
[development]
db.host = "localhost"
db.username = "root"
db.password = "toor"
db.dbname = "db_whoopdiedo"
db.charset = "utf8"
Run Code Online (Sandbox Code Playgroud)
bootstrap.php:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
public function _initAutoload()
{
Zend_Registry::set(
'config',
new Zend_Config_Ini(APPLICATION_PATH.'/configs/config.ini', 'development')
);
Zend_Registry::set(
'db',
Zend_Db::factory('Pdo_Mysql', Zend_Registry::get('config')->db)
);
Zend_Registry::get('db')->setFetchMode(Zend_Db::FETCH_OBJ);
Zend_Registry::get('db')->query("SET NAMES 'utf8'");
Zend_Registry::get('db')->query("SET CHARACTER SET 'utf8'");
}
}
Run Code Online (Sandbox Code Playgroud)
我认为在配置中添加charset就足够了,但是只有在我直接使用以下设置时才应用它:
Zend_Registry::get('db')->query("SET NAMES 'utf8'");
Zend_Registry::get('db')->query("SET CHARACTER SET 'utf8'");
Run Code Online (Sandbox Code Playgroud)
我的问题:有没有更好的方法来设置charset,也许配置明智?
我试图在我的UNIX上运行的apache服务器上运行我的ZEND应用程序.最初我的主机没有给PDO支持,我通过邮件请求它来启用它.但是现在我收到一个错误,说当前没有安装mysql驱动程序
堆栈跟踪如下:
An error occurred
Application error
Exception information:
Message: The mysql driver is not currently installed
Stack trace:
#0 /home/windchim/worminc/library/Zend/Db/Adapter/Abstract.php(770): Zend_Db_Adapter_Pdo_Abstract->_connect()
#1 /home/windchim/worminc/library/Zend/Db/Adapter/Abstract.php(840): Zend_Db_Adapter_Abstract->quote('aaditya258', NULL)
#2 /home/windchim/worminc/library/Zend/Auth/Adapter/DbTable.php(354): Zend_Db_Adapter_Abstract->quoteInto('`password` = MD...', 'aaditya258')
#3 /home/windchim/worminc/library/Zend/Auth/Adapter/DbTable.php(285): Zend_Auth_Adapter_DbTable->_authenticateCreateSelect()
#4 /home/windchim/worminc/library/Zend/Auth.php(117): Zend_Auth_Adapter_DbTable->authenticate()
#5 /home/windchim/worminc/application/controllers/LoginController.php(117): Zend_Auth->authenticate(Object(Zend_Auth_Adapter_DbTable))
#6 /home/windchim/worminc/library/Zend/Controller/Action.php(503): LoginController->processAction()
#7 /home/windchim/worminc/library/Zend/Controller/Dispatcher/Standard.php(285): Zend_Controller_Action->dispatch('processAction')
#8 /home/windchim/worminc/library/Zend/Controller/Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#9 /home/windchim/public_html/worm/index.php(47): Zend_Controller_Front->dispatch()
#10 {main}
Run Code Online (Sandbox Code Playgroud)
怎么解决这个问题?请帮忙
我正在通过构建一些供我自己使用的实用程序网站来慢慢建立我的Zend技能.我一直在使用Zend Forms和Form验证,到目前为止我一直很高兴我已经理解了Zend的做事方式.但是我对如何在编辑表单的上下文中使用Zend_Validate_Db_NoRecordExists()以及映射到必须唯一的数据库列的字段感到困惑.
例如,使用这个简单的表
TABLE Test
(
ID INT AUTO_INCREMENT,
Data INT UNIQUE
);
Run Code Online (Sandbox Code Playgroud)
如果我只是在Table Test中添加一个新行,我可以在Data字段的Zend Form元素中添加一个验证器:
$data = new Zend_Form_Element_Text('Data');
$data->addValidator( new Zend_Validate_Db_NoRecordExists('Test', 'Data') )
Run Code Online (Sandbox Code Playgroud)
在表单验证时,此验证程序将检查表中是否已存在Data元素的内容.因此,插入Test可以继续而不违反数据字段UNIQUE限定符.
但是,编辑Test表的现有行时情况会有所不同.在这种情况下,验证器需要检查元素值是否满足两个互斥条件条件之一:
用户已更改元素值,表中当前不存在新值.
用户未更改元素值.因此,该值不当前存在的表(这是确定).
在Zend的验证文档谈论加入一个参数到NoRecordExists()验证从验证过程不包括记录的目的.想法是"验证表格以查找任何匹配的行,但忽略a字段具有此特定值的任何命中".这样的用例是在编辑表时验证元素所需的用例.在1.9中执行此操作的伪代码就是这样(实际上我从1.9源代码中得到了这个 - 我认为当前的文档可能是错误的):
$data = new Zend_Form_Element_Text('Data');
$data->addValidator( new Zend_Validate_Db_NoRecordExists('Test', 'Data',
array ('field'=>'Data', 'Value'=> $Value) );
Run Code Online (Sandbox Code Playgroud)
问题是要被排除的值($ Value)在实例化时被绑定到验证器(也就是在实例化表单时).但是当表单正在编辑记录时,当表单最初填充数据时,该值需要绑定到$ data字段的内容 - IE最初从Test表行读取Data值.但是在典型的Zend模式中,表单被实例化并在两个单独的步骤中填充,这排除了将排除值绑定到期望的元素值.
下面的Zend伪代码标记了我想要将$ Value绑定到NoRecordExists()验证器的位置(并注意这是一个常见的Zend控制器模式):
$form = new Form()
if (is Post) {
$formData = GetPostData()
if ($form->isValid($formData)) {
Update Table with $formData
Redirect out of here …Run Code Online (Sandbox Code Playgroud) 有这样的zend查询:
$select = $this->_table
->select()
->where('title LIKE ?', '%'.$searchWord.'%')
->where('description LIKE ?', '%'.$searchWord.'%')
->where('verified=1 AND activated=1');
Run Code Online (Sandbox Code Playgroud)
换句话说,它看起来像:
SELECT `some_table`.* FROM `some_table` WHERE (title LIKE '%nice house%') AND (description LIKE '%nice house%') AND (verified=1 AND activated=1)
Run Code Online (Sandbox Code Playgroud)
如果我有几个AND语句,zend通过AND运算符连接它.如何将其与OR运算符连接?因为我需要:
...(title LIKE '%nice house%') OR (description LIKE '%nice house%')...
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助.
假设我有
$db is an instance of Zend_Db_Adapter_Abstract and
$sql = 'SELECT blah blah FROM table' will return a huge number of records.
Run Code Online (Sandbox Code Playgroud)
有两个代码片段来处理返回的数据,如下所示.
// Code fragment 1 (let's call it C1).
$results = $db->fetchAll($sql);
foreach ($results as $row) {
// Process $row
}
// Code fragment 2 (let's call it C2).
$stmt = $db->query($sql);
while ($row = $stmt->fetch()) {
// Process $row
}
Run Code Online (Sandbox Code Playgroud)
我的理解是C1会将所有返回的数据加载到$ results.因此,大量数据被加载到PHP内存中.以下是我的问题.
谢谢!
我和Magento一起工作了一年,并且学到了很多东西.现在我想学习Zend,我坚持使用模型.
我已经习惯了有实体和实体的集合中Magento的,并且很可能我会想使用Zend_Db_Table,Zend_Db_Table_Row和/或Zend_Db_Table_Rowset.我感到困惑的是每个班级的角色.
我知道我可以扩展每个类,我知道在我的Product_Table类(扩展Zend_Db_Table_Abstract)中,可以使用私有方法告诉Zend用于行和行集的类,但是我对它感觉不舒服.
在Magento中使用此代码:
例1
// I understand that maybe I'll use the `new` keyword instead
// Mage::getModel() is only for exemplification
$product = Mage::getModel('catalog/product');
$product->setName('product name');
$product->setPrice(20);
$product->save();
if($id = $product->getId()){
echo 'Product saved with id' . $id;
}
else{
echo 'Error saving product';
}
Run Code Online (Sandbox Code Playgroud)
例2
$collection = Mage::getModel('catalog/product')->getCollection();
// this is the limit, I'm ok with other method's name
$collection->setPageSize(10);
$collection->load()
foreach($collection as $product){
echo $product->getName() . ' …Run Code Online (Sandbox Code Playgroud) 我想使用Zend\Db\Sql\Select进行此查询:
SELECT table1.* FROM table1
INNER JOIN table2 ON table1.columnA = table2.columnB
INNER JOIN table3 ON table1.columnC = table3.columnD
WHERE (table2.column2 = 2 or table3.column3 = 3) and table1.column1 = 1
ORDER BY table1.columnE ASC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
到目前为止我有这个代码:
/*@var $db Adapter */
$db = $this->getServiceLocator()->get('db');
$sql = new Sql($db);
$select = $sql->select();
$select->from('table1');
$select->join('table2','table1.columnA = table2.columnB',array());
$select->join('table3','table1.columnC = table3.columnD',array());
$select->where(array('table2.column2' => 2, 'table2.column3' => 3), Predicate\PredicateSet::OP_OR);
$select->where(array('table1.column1' => 1),Predicate\PredicateSet::OP_AND);
$select->order('table1.columnE ASC');
$select->limit(1);
$statement = $sql->prepareStatementForSqlObject($select);
$resultSet = $statement->execute();
Run Code Online (Sandbox Code Playgroud)
但是不起作用,因为产生这个(没有"("和")"为OR):
SELECT …Run Code Online (Sandbox Code Playgroud)