我一直在尝试使用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);
}
}
答案 0 :(得分:1)
这是对代码的重写。我使用数组来构建嵌套的AND
和OR
条件,使用implode
来组合它们,而不是字符串连接的序列。我使用数组索引为每个占位符指定一个不同的名称。我将您的所有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[]
,请将price
循环更改为:
foreach($price1 as $i => $price) {
$ors[] = "price BETWEEN :pricelow{$i} AND :pricehigh{$i}";
$bind_array[":pricelow{$i}"] = $price;
$bind_array[":pricehigh{$i}"] = $price2[$i];
}
答案 1 :(得分:-2)
我担心你不能像你想要的那样迭代声明。而是使用fetch方法访问查询结果:
while ($row = $stmt->fetch([fetch mode, e.g., PDO::FETCH_ASSOC])) {
print_r($row);
}
关于“数组到字符串转换”错误,我怀疑一个或多个POST变量实际上是一个数组。要测试此假设,请尝试print_r($ _ POST)。