标签: zend-db

11
推荐指数
2
解决办法
2万
查看次数

使用Zend DB Select选择任意字符串?

我正在使用流畅的界面来创建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-framework zend-db

11
推荐指数
1
解决办法
3304
查看次数

Zend DB选择常量 - 表中不存在的列

我正在尝试使用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-framework zend-db-table zend-db zend-db-select

11
推荐指数
1
解决办法
4746
查看次数

为Zend_Db设置字符集的最佳方法(或者至少比我目前正在做的更好)

我正在使用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,也许配置明智?

php mysql zend-framework character-encoding zend-db

11
推荐指数
1
解决办法
7880
查看次数

Zend应用程序没有安装MySql驱动程序错误

我试图在我的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)

怎么解决这个问题?请帮忙

php mysql pdo zend-framework zend-db

10
推荐指数
2
解决办法
3万
查看次数

Zend表单编辑和Zend_Validate_Db_NoRecordExists

我正在通过构建一些供我自己使用的实用程序网站来慢慢建立我的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表的现有行时情况会有所不同.在这种情况下,验证器需要检查元素值是否满足两个互斥条件条件之一:

  1. 用户已更改元素值,表中当前不存在新值.

  2. 用户更改元素值.因此,该值当前存在的表(这是确定).

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)

php zend-framework zend-db zend-validate

10
推荐指数
2
解决办法
1万
查看次数

Zend-framework DB:OR而不是AND运算符

有这样的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)

非常感谢您的帮助.

zend-framework zend-db

10
推荐指数
2
解决办法
2万
查看次数

Zend_Db:fetchAll()或query()/ fetch()用于大量记录

假设我有

$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内存中.以下是我的问题.

  1. C2是否将所有数据加载到PHP内存中,或者像prepare/execute一样逐个处理?
  2. 假设没有其他选择,C1或C2是更好的选择吗?

谢谢!

php zend-framework zend-db

10
推荐指数
2
解决办法
2万
查看次数

在Magento之后学习Zend框架:模型

我和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)

php zend-framework magento zend-db-table zend-db

9
推荐指数
1
解决办法
2815
查看次数

Zend Framework 2 Sql选择OR和AND

我想使用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)

zend-db zend-framework2

9
推荐指数
2
解决办法
2万
查看次数