参数化查询问题在dao php
我为我的数据库操作使用phpdao。 当我运行这段代码有一个错误参数化查询问题在dao php
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
public function executeQuery($sql){
return mysql_query($sql, $this->connection);
}
然后有一个错误:
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这是一个解决方案:see details
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
请告诉我是这相当于一个解决方案,我的刀?
你做错了。 和解决方案从链接的问题不会帮助你。
如果您的“phpdao”没有setArray()
方法,您必须手动创建查询。
- 创建一个类似
(?,?,?,?,?,?)
的字符串,其中?s的数量等于数组的成员数。 - 将此字符串添加到您的查询中
- 在循环中绑定您的数组成员。
感谢Col,但是所有来自这个dao的设置函数只消毒用户输入,所以我将不得不这样做,但是这个dao的另外一个问题是它使用mysql_escape_string来清理用户输入,我认为它不被使用,所以我也应该使用PDO还是可以推荐其他工具? –
是的,就是这一点。你必须清理阵列成员。在一个循环中。 PDO是好的,我相信。 Bot注意到,使用PDO,您将会遇到完全相同的问题,无论您选择哪种模式 –
So $ dbh-> setAttribute(PDO :: ATTR_EMULATE_PREPARES,false);这不是解决你的问题吗?还有其他更好的数据库操作工具吗? –
- 语法是
LIMIT start, amount
- 您正在使用它作为LIMIT start, end
。 - 您正在使用
$sqlQuery->setStrig
- 这是不对的。 - 是
$city
数组?在这种情况下,您可能会喜欢使用WHERE city IN ?
。
如果你不满意,请添加评论。 –
Tom van der Woerdt谢谢你的回复,$ end只包含金额,city是一个字符串'城市名称',顺便提一下,问题是我在哪里有LIMIT或IN时使用的查询有错误。我只是想知道如何为这个dao手动设置ATTR_EMULATE_PREPARES这个参数。 –
然后仔细问你的问题:-)无论如何,要回答它:你正在使用'mysql_query()',它没有准备好的语句。从技术上讲,他们已经被模拟,所以你想要的是已经完成或根本不可能。 –
'INN'应为'IN' – DaveRandom
这是一个错字错误,请提供解决方案。 –
@ neel.1708:这里的大部分问题都是由错别字造成的。下次再多加小心:-) –