我只是測試了一堆案件。我在OS X上使用PHP 5.3.15,並查詢MySQL 5.6.12。
任意組合的作品,如果你設置:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
以下所有工作的:你可以使用一個int
或串;你不需要使用PDO :: PARAM_INT。
$stmt = $dbh->prepare("select user from mysql.user limit ?");
$int = intval(1);
$int = '1';
$stmt->bindValue(1, 1);
$stmt->execute();
print_r($stmt->fetchAll());
$stmt->bindValue(1, '1');
$stmt->execute();
print_r($stmt->fetchAll());
$stmt->bindValue(1, 1, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());
$stmt->bindValue(1, '1', PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());
$stmt->bindParam(1, $int);
$stmt->execute();
print_r($stmt->fetchAll());
$stmt->bindParam(1, $string);
$stmt->execute();
print_r($stmt->fetchAll());
$stmt->bindParam(1, $int, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());
$stmt->bindParam(1, $string, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());
也可以忘記bindValue()或bindParam(),而是通過其中一個int或字符串在陣列參數執行()。這工作正常,並做同樣的事情,但使用數組更簡單,通常更方便的代碼。
$stmt = $dbh->prepare("select user from mysql.user limit ?");
$stmt->execute(array($int));
print_r($stmt->fetchAll());
$stmt->execute(array($string));
print_r($stmt->fetchAll());
如果啓用模擬準備,只有一個組合的工作原理:你必須使用一個整數作爲參數和必須指定PDO :: PARAM_INT:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$stmt = $dbh->prepare("select user from mysql.user limit ?");
$stmt->bindValue(1, $int, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());
$stmt->bindParam(1, $int, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());
傳遞值的execute()如果您已啓用模擬準備工作,則不起作用。
感謝有關PDO參數的很多有用的信息! :) – Kamil
匿名downvoter:請讓我知道你爲什麼認爲這個答案是不正確的。也許我可以改進它。 –
我是另一個downvoter。我之所以下降是因爲:「你也可以忘記bindValue()或bindParam(),而是將數組參數中的一個int或一個字符串傳遞給execute(),只要禁用了模擬準備就行。準備好的陳述的力量是關於綁定的!與綁定habbit你不能忘記逃脫或鑄造。是的,有時你需要一些額外的代碼才能使它工作。但是:安全第一! – Terradon