簡體   English   中英

Bindparam中的PHP MySQL PDO語法錯誤

[英]PHP MySQL PDO syntax error in Bindparam

嗨,我正在嘗試使用PHP使用MySQL PDO從表中選擇一些隨機行

$query = $conn->prepare("SELECT * FROM `products` WHERE `cat` = :cat ORDER BY RAND() LIMIT :limit_to");

$query->bindParam(':limit_to', $limit, PDO::PARAM_INT);
$query->bindParam(':cat', $cat, PDO::PARAM_INT);
$stmt = $query->execute();

但是,這會引發這樣的mysql語法錯誤,

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2'' at line 1"

是什么導致此錯誤,為什么? 我沒有發現任何錯誤

問題在於,當您執行$limit = $_REQUEST['limit']; ,變量$ limit的類型為string

例如(兩者都包含數字,但變量類型不同):

$varInt = 2;
$varString = "2";

var_dump ($varInt);
var_dump ($varString);

prints:
    int 2
    string '2' (length=1)

因此,您准備好的語句將受到以下約束:

$limit = $_REQUEST['limit']; // $_REQUEST['limit'] = 2
$cat = 3;

SELECT * FROM `products` WHERE `cat` = :cat ORDER BY RAND() LIMIT :limit_to

用:limit_to ='2',:cat ='3'綁定

問題出在LIMIT語法中。 符號''破壞了語法。 您必須確保將整數變量綁定到$ limit。

// do it in first place you have access to $_REQUEST['limit'] or other global arrays , for example $_GET, $_POST

$limit = intval($_REQUEST['limit']); // $_REQUEST['limit'] = 2
 $cat = intval($blablabla); // or from any other source

$query = $conn->prepare("SELECT * FROM products WHERE 
                         cat = :cat ORDER BY RAND() 
                                    LIMIT :limit_to");

$query->bindValue(':limit_to', $limit, PDO::PARAM_INT);
$query->bindValue(':cat', $cat, PDO::PARAM_INT);
$stmt = $query->execute();

ps使用bindValue(),在99%的情況下效果更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM