【发布时间】:2014-02-24 20:46:41
【问题描述】:
我整天都在尝试使用 mysqli 的准备好的语句来进行概念验证,但后来决定使用 PDO,因为它具有绑定值的能力——我相信我需要它们,因为它的动态性质我的查询。
幕后的形式是这样的:http://pasteboard.co/k6H0cVq.png - 你也可以在这里了解这个概念。我的查询没有返回任何结果或错误,只是一个警告Array to string conversion - 在绑定值时发生。
我还担心我的值绑定不起作用,我不能将它们放在 foreach 循环中,因为它不能位于调用 $stmt 变量之前,否则会引发更多错误出去。
我一直在阅读文档和观看教程,但我找不到任何说明如何在查询是动态的情况下实现模型的内容。
我希望我足够清楚,试图了解 PDO 和准备好的陈述是一项令人沮丧的努力。
非常感谢任何帮助。 谢谢!
PHP
if (isset($_POST['platform'], $_POST['bandwidth'], $_POST['price'])){
$platform = $_POST['platform'];
$bandwidth = $_POST['bandwidth'];
$price = $_POST['price'];
$query = "SELECT * FROM 'hosts' WHERE";
foreach($platform as $platform) {
$query .= " 'platform' LIKE %:platform% OR";
}
$query = substr($query, 0, -2);
foreach($bandwidth as $bandwidth) {
$query .= " AND 'bandwidth' BETWEEN :bandwidth OR";
}
$query = substr($query, 0, -2);
foreach($price as $price) {
$query .= " AND 'price' BETWEEN :price OR";
}
$query = substr($query, 0, -2);
$conn = new PDO('mysql:host=127.0.0.1; dbname=test', 'root', '');
$stmt = $conn->prepare($query);
if ($_POST['platform']){
$stmt->bindValue(':platform', $_POST['platform']);
}
if ($_POST['bandwidth']){
$stmt->bindValue(':bandwidth', $_POST['bandwidth']);
}
if ($_POST['price']){
$stmt->bindValue(':price', $_POST['price']);
}
$stmt->execute();
foreach($stmt as $row) {
print_r($row);
}
}
【问题讨论】:
-
您不能多次使用同一个命名占位符。您不能将数组绑定到占位符。如果你有占位符,它们需要被绑定——所以不要有条件地绑定。没有像
BETWEEN ... OR ...这样的运算符。您应该在foreach()语句中为赋值使用一个变量名,该变量名与它所迭代的数组的名称不同。您应该激活将导致显示错误信息的 PDO 错误模式,或者显式测试错误条件。这应该足以让您入门。 -
谢谢。当您谈论占位符时,是否与以下内容有关: 'bandwidth' BETWEEN :bandwidth OR foreach ($price as $price)
-
您在查询中的列名周围使用了错误类型的引号,它们应该是反引号,而不是单引号。
-
您还需要关注
AND和OR的优先级,您可能需要在所有OR组周围加上括号。 -
你不能写
LIKE %:platform%,因为LIKE的参数必须是一个字符串。应该是LIKE CONCAT('%', :platform, '%')。
标签: php mysql database pdo prepared-statement