Php PDO准备的语句未返回结果
我整天都在试图用mysqli准备好的语句来证明概念,但由于PDO具有绑定值的能力,我决定使用它来证明概念——我相信我需要它们,因为我的查询是动态的 幕后的形式是这样的:-你也可以在这里得到一个概念的想法。我的查询不返回任何结果或错误,只返回一个警告数组到字符串的转换,这是在绑定值时发生的 我还担心我的值绑定不起作用,我不能将它们放在foreach循环中,因为它不能在$stmt变量被调用之前定位,否则会抛出更多错误 我一直在阅读文档和观看教程,但我找不到任何东西显示如何实现查询是动态的模型 我希望我足够清楚,试图让我的头脑了解PDO并准备好总体声明是一个令人沮丧的努力 非常感谢您的帮助。 谢谢 PHPPhp PDO准备的语句未返回结果,php,mysql,database,pdo,prepared-statement,Php,Mysql,Database,Pdo,Prepared Statement,我整天都在试图用mysqli准备好的语句来证明概念,但由于PDO具有绑定值的能力,我决定使用它来证明概念——我相信我需要它们,因为我的查询是动态的 幕后的形式是这样的:-你也可以在这里得到一个概念的想法。我的查询不返回任何结果或错误,只返回一个警告数组到字符串的转换,这是在绑定值时发生的 我还担心我的值绑定不起作用,我不能将它们放在foreach循环中,因为它不能在$stmt变量被调用之前定位,否则会抛出更多错误 我一直在阅读文档和观看教程,但我找不到任何东西显示如何实现查询是动态的模型 我希望
恐怕你不能像你想做的那样重复这句话。而是使用以下方法访问查询结果:
while ($row = $stmt->fetch([fetch mode, e.g., PDO::FETCH_ASSOC])) {
print_r($row);
}
关于您得到的数组到字符串转换错误,我怀疑一个或多个POST变量实际上是一个数组。要验证这一假设,请尝试打印文章。这里是对代码的重写。我使用数组来构建嵌套的AND和OR条件,使用内爆来组合它们,而不是字符串串联序列。我使用数组索引为每个占位符指定不同的名称。我将所有的BETWEEN子句更改为=因为BETWEEN需要两个参数,即范围的开始和结束
if (isset($_POST['platform'], $_POST['bandwidth'], $_POST['price'])){
$platform = $_POST['platform'];
$bandwidth = $_POST['bandwidth'];
$price = $_POST['price'];
$query = "SELECT * FROM hosts";
$ands = array();
$bind_array = array();
$ors = array();
foreach($platform as $i => $platform) {
$ors[] = "platform LIKE CONCAT('%', :platform{$i}, '%')";
$bind_array[":platform{$i}"] = $platform;
}
if ($ors) {
$ands[] = "(" . implode(" OR ", $ors) . ")";
}
$ors = array();
foreach($bandwidth as $i => $bandwidth) {
$ors[] = "bandwidth = :bandwidth{$i}";
$bind_array[":bandwidth{$i}"] = $bandwidth;
}
if ($ors) {
$ands[] = "(" . implode(" OR ", $ors) . ")";
}
$ors = array();
foreach($price as $i => $price) {
$ors[] = "price = :price{$i}";
$bind_array[":price{$i}"] = $price;
}
if ($ors) {
$ands[] = "(" . implode(" OR ", $ors) . ")";
}
if ($ands) {
$query .= " WHERE " . implode(" AND ", $ands);
}
$conn = new PDO('mysql:host=127.0.0.1; dbname=test', 'root', '');
$stmt = $conn->prepare($query);
$stmt->execute($bind_array);
foreach ($stmt as $row) {
print_r($row);
}
}
更新:
如果某个范围有两个参数price1[]和price2[],请将价格循环更改为:
另外,我知道它们是数组,如果你看一下select boxed链接中的图像,它们允许多个选项从而返回一个数组。我想你的意思是键入:while$row=$stmt->fetch PDO::fetch_ASSOC-对我来说,它不会返回错误。但目前还没有解决更大的问题--这个答案太离题了。PDO语句实现,因此完全可以像OP最初所做的那样使用foreach对其进行迭代。此外,这个答案完全无法识别OP代码中的任何其他严重问题。@eggyal我不知道PDO语句实现了Traversable,并欣赏这些信息。也就是说,您的评论是粗鲁的,因此不合适。您不能多次使用同一个命名占位符。不能将数组绑定到占位符。如果你有占位符,它们需要被绑定——所以不要有条件地绑定。在……之间没有这样的接线员。。。或您应该在foreach语句中为值赋值使用一个变量名,该变量名与它所迭代的数组名不同。您应该激活PDO错误模式,该模式将导致显示错误信息,或者显式测试错误条件。这应该足够让你开始了。谢谢。当您谈论占位符时,是否考虑以下内容:“带宽”介于:带宽或foreach$price作为$price之间?您在查询中对列名使用了错误类型的引号,它们应该是反勾号,而不是单引号。您还需要关注AND和OR的优先级,您可能需要在所有或组周围加括号。您不能编写LIKE%:platform%,因为LIKE的参数必须是字符串。它应该像CONCAT“%”,:platform“%”。我欠你很多,谢谢你的朋友!我会在早上尝试这个,我来自英国。小问题-解析错误:语法错误,第81行意外的'as'T_'as。但是,记事本中的第81行不包含“as”。知道为什么会这样吗?我得试试,我等不及了。哈哈,问得好!它是:while$stmt作为$row{这应该是foreach。我开始将它改为while,然后不完全地将它解开。
if (isset($_POST['platform'], $_POST['bandwidth'], $_POST['price'])){
$platform = $_POST['platform'];
$bandwidth = $_POST['bandwidth'];
$price = $_POST['price'];
$query = "SELECT * FROM hosts";
$ands = array();
$bind_array = array();
$ors = array();
foreach($platform as $i => $platform) {
$ors[] = "platform LIKE CONCAT('%', :platform{$i}, '%')";
$bind_array[":platform{$i}"] = $platform;
}
if ($ors) {
$ands[] = "(" . implode(" OR ", $ors) . ")";
}
$ors = array();
foreach($bandwidth as $i => $bandwidth) {
$ors[] = "bandwidth = :bandwidth{$i}";
$bind_array[":bandwidth{$i}"] = $bandwidth;
}
if ($ors) {
$ands[] = "(" . implode(" OR ", $ors) . ")";
}
$ors = array();
foreach($price as $i => $price) {
$ors[] = "price = :price{$i}";
$bind_array[":price{$i}"] = $price;
}
if ($ors) {
$ands[] = "(" . implode(" OR ", $ors) . ")";
}
if ($ands) {
$query .= " WHERE " . implode(" AND ", $ands);
}
$conn = new PDO('mysql:host=127.0.0.1; dbname=test', 'root', '');
$stmt = $conn->prepare($query);
$stmt->execute($bind_array);
foreach ($stmt as $row) {
print_r($row);
}
}
foreach($price1 as $i => $price) {
$ors[] = "price BETWEEN :pricelow{$i} AND :pricehigh{$i}";
$bind_array[":pricelow{$i}"] = $price;
$bind_array[":pricehigh{$i}"] = $price2[$i];
}