PDO mySql查询在调用时第二次没有在for循环中执行

Rol*_*and 0 php mysql pdo

我有一个问题,我循环抛出一组值,然后用每个循环创建一个PDO mySql查询,现在问题是第一个查询正在执行并返回结果,但第二个向上不返回结果.如果我在服务器上手动执行查询,则返回结果.这很奇怪,也许我在这里做错了.我的代码如下

if($num_results > 0){
 for($i=0;$i<$num_results;$i++){
   $sql_sub = "SELECT * FROM menu_config WHERE client_id =".$client_id ." AND id =".$data[$i]['root_menu_id'];

                    $results_s = $pdo->query($sql_sub);

                    $data_s = $results_s->fetchAll(PDO::FETCH_ASSOC);

                    $sub_menu_title = "<strong>".$data[$i]['title']."</strong>";

                    if(empty($data_s[0]['title'])){
                        $main_menu_title = '<span style="color:#FF0000;font-weight:bold;">No Main Menu Assigned to Sub Menu</span>';
                    }else{
                        $main_menu_title = $data_s[0]['title'];
                    }
                    $men_title = $data[$i]['title']
 }
}
Run Code Online (Sandbox Code Playgroud)

mun*_*nch 5

(这可能比你要求的多一点)

你似乎错过了准备语句所做的一些好事.

首先,您通常不希望将值直接传递给查询.(有时候这是必要的,但不是这里).通过这样做,你可以取出所有保护sql注入的好东西.相反,您希望在准备好查询后将它们作为参数发送.

其次,在循环中,如果您通过准备语句反复运行相同的查询,然后只使用该PDOStatement::bindParam()函数更改发送到该预准备语句的值,则可以节省自己的时间和资源.

第三,fetchAll()不采用PDO :: FETCH_ASSOC的'fetch_style'.fetch()确实.但我认为你可以使用默认值或使用fetchAll来实现.你必须检查它,看看你需要什么.这是fetchAll文档

$sql_sub = "SELECT * FROM menu_config WHERE client_id = :client_id AND id = :id ";
$query = $pdo->prepare($sql_sub);
for($i=0;$i<$num_results;$i++){
   $query->bindParam(':client_id', $client_id);
   $query->bindParam(':id', $data[$i]['root_menu_id']);
   $query->execute();

   $data_s = $query->fetchAll();
   $sub_menu_title = "<strong>".$data[$i]['title']."</strong>";

   if(empty($data_s[0]['title'])){
      $main_menu_title = '<span style="color:#FF0000;font-weight:bold;">
            No Main Menu Assigned to Sub Menu</span>';
   }else{
      $main_menu_title = $data_s[0]['title'];
   }

   $men_title = $data[$i]['title'];
}
Run Code Online (Sandbox Code Playgroud)