我正在尝试在PHP应用程序中获取Sqlite DB的最后一个插入的行ID.我正在使用Zend Framework的PDO Sqlite适配器进行数据库处理.lastInsertId()方法应该给我结果,但它不会.在php.net的PDO文档中,我读到lastInsertId()在所有数据库上的工作方式可能不同.但它根本不适用于sqlite吗?我尝试通过这个覆盖适配器的lastInsertId()方法:
// Zend_Db_Adapter_Pdo_Sqlite
public function lastInsertId() {
$result = $this->_connection->query('SELECT last_insert_rowid()')->fetch();
return $result[0];
}
Run Code Online (Sandbox Code Playgroud)
但它也不起作用.我每次打电话都会返回0.是否有任何特殊的清洁方式来找到最后插入的ID?
我有这个问题:
SELECT g.title, g.asin, g.platform_id, r.rank
FROM games g
INNER JOIN ranks r ON ( g.id = r.game_id )
ORDER BY r.rank DESC
LIMIT 5`
Run Code Online (Sandbox Code Playgroud)
现在,这是我的JOIN使用,Zend_Db_Select但它给了我数组错误
$query = $this->select();
$query->from(array('g' => 'games'), array());
$query->join(array('r' => 'ranks'), 'g.id = r.game_id', array('g.title', 'g.asin', 'g.platform_id', 'r.rank'));
$query->order('r.rank DESC');
$query->limit($top);
$resultRows = $this->fetchAll($query);
return $resultRows;Run Code Online (Sandbox Code Playgroud)
谁知道我可能做错了什么?我希望显示"游戏"中的所有列以及排名表中的"排名"列.
好的就是这种情况,我有一个用Zend_Framework编写的应用程序,它兼容MySQL和MSSQL作为后端.现在,ZF非常擅长解决这两种语言之间的许多SQL差异/差异,但我还没有想出这个.
目标是从表中选择1个随机记录,这是一个非常简单的陈述.
这是一个select语句,例如:
$sql = $db->select()
->from("table")
->order("rand()")
->limit(1);
Run Code Online (Sandbox Code Playgroud)
这适用于MySQL数据库表,因为MySQL的sql如下:
SELECT `table`.* FROM `table` ORDER BY rand() ASC
Run Code Online (Sandbox Code Playgroud)
另一方面,现在MSSQL使用newid()函数进行随机化.
有没有某种帮助我可以传递给order()函数,以使它意识到它必须使用正确的顺序?我搜索了文档和zfforums,发现了一些提示,但没有什么可靠的.
我找到的其中一件事是:
ORDER BY RANDOM()无效 - ZFForums.com
他们使用以下内容:
$res = $db->fetchAll(
'SELECT * FROM table ORDER BY :random',
array('random' => new Zend_Db_Expr('RANDOM()')
);
Run Code Online (Sandbox Code Playgroud)
它工作...但我不打算通过键入它并对字符串进行替换来构建我的select语句,我试图将它保存在相同的Zend_Db_Select对象中.我也尝试过Zend_Db_Expr('RANDOM()')进入->order()声明,但它失败了.他还发布了一个理论解决方案来找到答案,但我不打算重写这个函数,修改$ db-> fetch()调用.
有任何想法吗?
看起来有几种不同的方法可以使用Zend Framework连接两个表,但我以前从未这样做过,所以我不知道哪种方法最好.
这就是我要做的......
我的数据库中有3个表:
users
( id , name )
groups
( id , name )
group_members
( id , group_id , user_id )
Run Code Online (Sandbox Code Playgroud)
我正在尝试查找用户所属的组并将其显示给用户.这个SQL语句几乎完成了这项工作(虽然可能有更好的方法来编写它).它只返回我关注的列,它们是组的id和title.
SELECT groups.id, groups.title
FROM group_members
INNER JOIN groups
ON groups.id = group_members.group_id
WHERE user_id = $userId
Run Code Online (Sandbox Code Playgroud)
如何使用Zend Framework完成此操作?
zend-framework inner-join zend-db-table zend-db zend-db-select
目前,我正在定期DbTable Auth Adapter:
protected function _getAuthAdapter($formData)
{
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('users')
->setIdentityColumn('username')
->setCredentialColumn('password');
$authAdapter->setIdentity($formData['username']);
$authAdapter->setCredential(md5($formData['password']));
return $authAdapter;
}
Run Code Online (Sandbox Code Playgroud)
但我想检查数据库中的其他列(IsActive例如).我不知道是否可以使用适配器完成此操作.如何才能做到这一点?
我一直在尝试用ZendFW构建一个sql查询,但我似乎无法让它像我想要的那样运行(或者根本不起作用).这是我正在尝试使用zend_db select()构建的查询
SELECT tc.trip_title, td.ID, td.trip_id,
(SELECT count(*) FROM 'trips_invites' ti
WHERE ti.destination_id=td.ID AND ti.accepted ='NR') AS "pending_invites"
FROM `trips_current` AS `tc`, `trips_data` AS `td`
WHERE (tc.ID=td.trip_id) AND (tc.creator_id = '1')
ORDER BY `trip_id` ASC
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚的是如何在那里正确地获得子查询,我尝试的任何东西似乎都没有用.
任何帮助将不胜感激!
谢谢!
编辑/答案:如果有人会遇到类似的问题,根据下面的建议我通过以下方式通过查询重新工作:
SELECT `tc`.`trip_title`, `td`.`ID`, `td`.`trip_id`, count(TI.ID)
FROM `trips_current` AS `tc`
INNER JOIN `trips_data` AS `td` ON td.trip_id = tc.ID
LEFT JOIN trips_invites AS TI ON ti.destination_id = td.id
WHERE tc.creator_id = 1 AND ti.accepted='NR'
GROUP BY td.id
ORDER BY `trip_id` ASC …Run Code Online (Sandbox Code Playgroud) 我正在使用zend框架开发一个Web应用程序.对于select语句,我使用了以下方法.
例如:
public function getData($name)
{
$sql = "SELECT * from customer where Customer_Name = '$name'";
return $this->objDB->getAdapter()->fetchAll ($sql);
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,如果我将客户名称发送为:colvin's place,则查询失败.我知道这是因为单引号.
之前我用过addslashes PHP函数.但我发现这不是一个很好的方法.这次我使用mysql_real_escape_stringPHP函数.
问题在于警告说.
Warning</b>: mysql_real_escape_string() [<a href='function.mysql-real-escape-string'>function.mysql-real-escape-string</a>]: Access denied for user 'ODBC'@'localhost' (using password: NO)
这是因为该mysql_real_escape_string函数需要连接到打开的数据库mysql_connect.我的问题是如何在*Zend_DB*类中使用它.我总是需要使用自定义选择查询.如果可以,请欣赏您的其他建议.
谢谢
我正在使用Zend Framework进行PHP开发,这是我用来执行查询的一个小函数.这不是一个错误.代码和一切正常.但我想知道这背后的一些概念.
/**
* Get dataset by executing sql statement
*
* @param string $sql - SQL Statement to be executed
*
* @return bool
*/
public function executeQuery($sql)
{
$this->sqlStatement = $sql;
if ($this->isDebug)
{
echo $sql;
exit;
}
$objSQL = $this->objDB->getAdapter()->prepare($sql);
try
{
return $objSQL->execute();
}
catch(Exception $error)
{
$this->logMessage($error->getMessage() . " SQL : " .$sql);
return false;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
贝娄对我来说不太清楚.
谢谢你,感谢你对此的建议和意见.
我使用Zend框架2.x并面对问题,因为我已经搜索了很多.我想在查询中使用like子句,但每次都会给出错误:
这是我的努力:
$sql = new Sql($this->adapter);
$select = $sql->select()->columns(
array('user_profile_id', 'profile_login_name'))->from($this->table)->where->like(
'profile_login_name', '%'.$strSearch.'%');
echo $select->getSqlString(); die;
Run Code Online (Sandbox Code Playgroud)
但是这给出了错误:
致命错误:在第131行的 /var/www/YAAB/branches/admin/models/Model/UserTable.php中调用未定义的方法Zend\Db\Sql\Where :: getSqlString()
我也使用了Zend\Db\Sql\Predicate但这也给出了错误.
所以我的问题是
请尽快回复,因为它很紧急.
在我的映射器类,我延长AbstractDbMapper从ZfcBase从数据库中提取行.一个简单的例子就是这样的代码:
class MyMapper extends AbstractDbMapper
{
//...
public function fetchAll() {
$select = $this->getSelect();
return $this->select($select); // returns HydratingResultSet
}
}
Run Code Online (Sandbox Code Playgroud)
问题是$this->select()返回a Zend\Db\ResultSet\HydratingResultSet(包含所需和水合物体).但我想返回这些对象的数组而不是HydratingResultSet包含对象的数组.
首先要看的是,HydratingResultSet::toArray()但这会返回一个多维数组,而不是一个对象数组.
所以我选择手工完成:
public function fetchAll() {
$select = $this->getSelect();
$results = array();
foreach ($this->select($select) as $object) {
$results[] = $object;
}
return $results; // returns array of needed objects
}
Run Code Online (Sandbox Code Playgroud)
这有效,但在每个获取方法中都看起来很难看.我是否必须修改select()中的代码才能获得所需的行为或者是否有更简单的方法?
顺便说一句:甚至建议返回一个数组或像这样转换它?谢谢你的帮助!