参数化查询问题在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); 

请告诉我是这相当于一个解决方案,我的刀?

+2

'INN'应为'IN' – DaveRandom

+0

这是一个错字错误,请提供解决方案。 –

+0

@ neel.1708:这里的大部分问题都是由错别字造成的。下次再多加小心:-) –

你做错了。 和解决方案从链接的问题不会帮助你。

如果您的“phpdao”没有setArray()方法,您必须手动创建查询。

  1. 创建一个类似(?,?,?,?,?,?)的字符串,其中?s的数量等于数组的成员数。
  2. 将此字符串添加到您的查询中
  3. 在循环中绑定您的数组成员。
+0

感谢Col,但是所有来自这个dao的设置函数只消毒用户输入,所以我将不得不这样做,但是这个dao的另外一个问题是它使用mysql_escape_string来清理用户输入,我认为它不被使用,所以我也应该使用PDO还是可以推荐其他工具? –

+0

是的,就是这一点。你必须清理阵列成员。在一个循环中。 PDO是好的,我相信。 Bot注意到,使用PDO,您将会遇到完全相同的问题,无论您选择哪种模式 –

+0

So $ dbh-> setAttribute(PDO :: ATTR_EMULATE_PREPARES,false);这不是解决你的问题吗?还有其他更好的数据库操作工具吗? –

  1. 语法是LIMIT start, amount - 您正在使用它作为LIMIT start, end
  2. 您正在使用$sqlQuery->setStrig - 这是不对的。
  3. $city数组?在这种情况下,您可能会喜欢使用WHERE city IN ?
+0

如果你不满意,请添加评论。 –

+0

Tom van der Woerdt谢谢你的回复,$ end只包含金额,city是一个字符串'城市名称',顺便提一下,问题是我在哪里有LIMIT或IN时使用的查询有错误。我只是想知道如何为这个dao手动设置ATTR_EMULATE_PREPARES这个参数。 –

+0

然后仔细问你的问题:-)无论如何,要回答它:你正在使用'mysql_query()',它没有准备好的语句。从技术上讲,他们已经被模拟,所以你想要的是已经完成或根本不可能。 –