php中dao中的参数化查询问题
我正在使用用于数据库操作的。 当我运行此代码时,出现了一个错误php中dao中的参数化查询问题,php,mysql,Php,Mysql,我正在使用用于数据库操作的。 当我运行此代码时,出现了一个错误 function queryByContentAndCreatedBy($city,$min,$max){ $sql = "SELECT id FROM users WHERE city=? LIMIT ?,? "; $sqlQuery = new SqlQuery($sql); $sqlQuery->setString($city); $sqlQuery->setNumber($min)
function queryByContentAndCreatedBy($city,$min,$max){
$sql = "SELECT id FROM users WHERE city=? LIMIT ?,? ";
$sqlQuery = new SqlQuery($sql);
$sqlQuery->setString($city);
$sqlQuery->setNumber($min);
$sqlQuery->setNumber($max);
return $this->executeUpdate($sqlQuery);
}
public static function executeUpdate($sqlQuery){
$transaction = Transaction::getCurrentTransaction();
if(!$transaction){
$connection = new Connection();
}else{
$connection = $transaction->getConnection();
}
$query = $sqlQuery->getQuery();
$result = $connection->executeQuery($query);
if(!$result){
throw new Exception(mysql_error());
}
return mysql_affected_rows();
}
Connection.php
然后是一个错误:
You have an error in your SQL syntax ... near ('Pu\'m','d\'Artagnan','s\dsd') at line 1
类似的错误也适用于此查询
$sql = "SELECT id FROM users WHERE city IN (?,?)";
在PDO中,这是一种解决方案:
对于我的dao,什么是等效的解决方案
LIMIT start,amount
-您将其用作LIMIT start,end
$sqlQuery->setStrig
-这不可能是正确的$city
是数组吗?在这种情况下,您可能希望使用城市在哪里?
setArray()
方法,则必须手动创建查询
(?,?,?,?,?,?,?)
的字符串,其中?的数量等于数组的成员数量这是一个打字错误,请提供一个解决方案。@neel.1708:这里的大多数问题都是由打字错误引起的。下次要更小心:-)Tom van der Woerdt感谢您的回复,$end只包含金额,city是字符串“city name”,顺便说一句,问题是在有限制或有错误的情况下使用哪个查询。我只想知道如何设置ATTR\u EMULATE\u为此dao手动准备此参数。然后更仔细地问您的问题:-)无论如何,回答它:您使用的是
mysql\u query()
,它没有准备好的语句。从技术上讲,它们已经被模拟过了,所以你想要的要么已经完成了,要么根本不可能完成。谢谢Col,但是这个dao中的所有设置函数都只清理用户输入,所以我也必须这么做,但是这个dao的另一个问题是它使用mysql\u escape\u字符串清理用户输入,我认为这是不推荐的,那么我应该也使用PDO吗?或者你能推荐其他工具吗?是的,这就是重点。您必须清理数组成员。在一个循环中。我相信PDO没事。注意,对于PDO,无论您选择哪种模式,都会遇到完全相同的问题:o$dbh->setAttribute(PDO::ATTR\u EMULATE\u PREPARES,false);这不是解决了你的问题吗?还有其他更好的DB操作工具吗?它解决了我的问题,但你的问题不同。您问题的解决方案已发布在我的答案-三项列表中。它适用于phpdao和PDO。事实上,这个问题是为你们所有人提出的,你们知道像PDO这样的PHPDB工具吗?我知道我可以用谷歌搜索它,但如果你们知道你们使用过的任何其他工具,或者你们知道哪些工具值得使用,请给我链接。
$sql = "SELECT id FROM users WHERE city IN (?,?)";
$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );