【问题标题】:Sql select the elements match to array and display them in a rowSql 选择匹配到数组的元素并在一行中显示
【发布时间】:2016-02-15 18:39:01
【问题描述】:

我有一个带有多个复选框的表单,客户可以在其中选择一个或多个项目

我将值传递给一个页面 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

我想显示连续选择的项目的结果,例如:

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>&euro; ".$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();
    }

我也尝试执行语句 fecth out of cycle for 但我从变量 $_POST['choices'] 得到最后一项而不是全部。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    你应该在这里做的是使用IN CLAUSE。将$_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)
    

    这也可以让您不必循环您的 $_POST 并不必要地执行多个查询。

    旁注

    我不确定您的实际表是否命名为my-tb,但如果您的表名中有hyphens,则必须使用backticks 来封装字符串名称。

    【讨论】:

    • 我已经在 phpmyadmin 面板中使用“in 子句”测试了您的查询,它显示了正确的结果和警告“此表不包含唯一列”。此外,当我尝试执行页面 php 时,回显语句仅显示单个项目而不是所有项目。在我早期的问题中,我的目标是显示从客户那里选择的所有项目。也许 J 错了代码 php 或表的结构。表的真实名称是没有连字符的,谢谢你的注意
    【解决方案2】:

    在这个查询语句中:

    $po="SELECT  name, item, price, images  FROM my-tb WHERE item ='".$_POST['choices'][$i]."'";
    

    你可以使用item='item 1' or item='item 2' or .... 创建语句的完整代码如下:

    $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;
    

    【讨论】:

    • 但是为什么呢?这正是 ...IN 子句存在的目的。
    • 是的,这只是获得相同结果的另一种方式。但是一旦我坚持使用 IN 因为我的帖子数据包含特殊字符。或者帮我脱身。对于数字和字母数据,我同意 IN 总是最好的。
    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2020-06-01
    • 2011-07-10
    相关资源
    最近更新 更多