2011-12-01 81 views
0

我爲我的數據庫操作使用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:這裏的大部分問題都是由錯別字造成的。下次再多加小心:-) –

回答

0

你做錯了。 和解決方案從鏈接的問題不會幫助你。

如果您的「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
  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()',它沒有準備好的語句。從技術上講,他們已經被模擬,所以你想要的是已經完成或根本不可能。 –