Php Sql选择与数组匹配的元素并将它们显示在一行中
我有一个带有多个复选框的表单,客户可以在其中选择一个或多个项目 我将值传递给php页面,在该页面中使用select语句获取从db中选择的项目的价格和图像Php Sql选择与数组匹配的元素并将它们显示在一行中,php,mysql,Php,Mysql,我有一个带有多个复选框的表单,客户可以在其中选择一个或多个项目 我将值传递给php页面,在该页面中使用select语句获取从db中选择的项目的价格和图像 ID | Name | Price | Images | item 1 | bob | 10 | link | a 2 | bob | 5 | link | b 3 | bob | 5 | link | c 4 | bob | 5 | link | d 我想显示一行中所选
ID | Name | Price | Images | item
1 | bob | 10 | link | a
2 | bob | 5 | link | b
3 | bob | 5 | link | c
4 | bob | 5 | link | d
我想显示一行中所选项目的结果,如:
bob a b
下面的代码不允许我在客户选择多个项目时看到此结果
// $_POST['choices'] array
$result = count($_POST['choices']);
require("config.casa.php"); //file connection db
try {
$dbh = new PDO("mysql:host=$DB_Server;dbname=$DB_DBName",$DB_Username,$DB_Password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // <== add this line
echo 'Connected to Database<br/>';
for($i=0; $i<$result; $i++){
$po="SELECT name, item, price, images FROM my-tb WHERE item ='".$_POST['choices'][$i]."'";
$rpo=$dbh->prepare($po);
$rpo->execute();
$pol = $rpo->fetch(PDO::FETCH_ASSOC);
echo "<ul class=\"tab\"><li class=\"col1\">"."name"."</li>";
echo "<li class=\"col2\"><p class=\"two\"><h3>€ ".$pol['price']."</h3></p>";
echo "<p class=\"lin\"><strong><span class=\"up\">".$pol['images']."</strong></p>";
<li class=\"col3\">".$row["item"]."</li></ul>
}
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
/$\u POST['choices']数组
$result=计数($_POST['choices']);
要求(“config.casa.php”)//文件连接数据库
试一试{
$dbh=newpdo(“mysql:host=$DB_Server;dbname=$DB_dbname”、$DB_Username、$DB_Password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//执行();
$pol=$rpo->fetch(PDO::fetch_ASSOC);
echo“- ”名称“
”;
echo“&euro;“$pol['price'”。”
”;
echo“”$pol['images']。“
”;
- “$row[“item”]。”
}
$dbh=null;
}
捕获(PDO$e)
{
echo$e->getMessage();
}
我还尝试执行语句fecth of cycle for,但我从变量
$\u POST['choices']
中获取了最后一项,而不是全部。将$\u POST[]
转换为逗号分隔的字符串
$choices = implode(', ', $_POST['choices']);
SELECT name, item, price, images FROM `my-tb` WHERE item IN ($choices)
这将生成如下查询:
SELECT name, item, price, images FROM `my-tb` WHERE item IN (a,b,d)
这也使得您不会在$\u POST
上循环,不必要地执行多个查询
旁注
我不确定您的实际表是否命名为
my tb
,但如果表名中有连字符
,则必须使用反勾号
来封装字符串名称。在此查询语句中:
$po="SELECT name, item, price, images FROM my-tb WHERE item ='".$_POST['choices'][$i]."'";
您可以使用item='item 1'或item='item 2'或..
创建语句的完整代码如下所示:
$condition="";
$count=count($_POST['choices']);
$i=0;
foreach($_POST['choices'] as $value) { $i++;
if($i<$count) {
$condition.="item='".$value."' or ";
} else {
$condition.="item='".$value."'"; //Last element should not contain or at the end
}
}
$po="SELECT name, item, price, images FROM my-tb WHERE ".$condition;
$condition=”“;
$count=count($_POST['choices']);
$i=0;
foreach($_POST['choices']作为$value){$i++;
如果($I为什么?这正是…IN
子句存在的目的。是的,这只是获得相同结果的另一种方式。但一旦我坚持使用IN,因为我的帖子数据包含特殊字符。或者帮助我退出。对于数字和字母数据,我同意IN始终是最好的。我已经用“IN子句”测试了您的查询在面板phpmyadmin中,显示正确的结果和警报“此表不包含唯一列”。另外,当我尝试执行页面php时,echo语句只显示一个项目,而不是所有项目。在我之前的问题中,我的目标是显示从客户处选择的所有项目。可能是J搞错了php代码或表的结构。表的真实名称没有连字符,谢谢您的说明