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

Php 调用时第二次在for循环中未执行PDO mySql查询,php,mysql,pdo,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

我有一个问题,我循环抛出一组值,然后用每个循环创建一个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']
 }
}
if($num\u results>0){
对于($i=0;$iquery($sql\u sub);
$data_s=$results_s->fetchAll(PDO::FETCH_ASSOC);
$sub_menu_title=“”$data[$i]['title']。“”;
if(空($data_s[0]['title'])){
$main_menu_title='没有主菜单分配给子菜单';
}否则{
$main_menu_title=$data_s[0]['title'];
}
$men\U title=$data[$i]['title']
}
}
(这可能比您要求的要多一点)

你似乎错过了一些事先准备好的陈述所能做的好事

首先,您通常不希望将值直接传递到查询中(有时是必要的,但这里不需要)。这样做,您就可以去掉所有可以防止sql注入的好东西。相反,您希望在准备好查询后将它们作为参数发送

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

第三,
fetchAll()
不采用PDO::fetch_ASSOC的“fetch_风格”。
fetch()
采用。但我认为您可以使用fetchAll使用默认设置或无设置。您必须检查这一点,看看您需要什么。以下是

$sql\u sub=“从客户机id=:客户机id和id=:id的菜单配置中选择*”;
$query=$pdo->prepare($sql\u sub);
对于($i=0;$ibindParam(':client\u id',$client\u id));
$query->bindParam(':id',$data[$i]['root\u menu\u id']);
$query->execute();
$data_s=$query->fetchAll();
$sub_menu_title=“”$data[$i]['title']。“”;
if(空($data_s[0]['title'])){
$main\u menu\u title='1
没有主菜单分配给子菜单';
}否则{
$main_menu_title=$data_s[0]['title'];
}
$men_title=$data[$i]['title'];
}
(这可能比您要求的要多一点)

你似乎错过了一些事先准备好的陈述所能做的好事

首先,您通常不希望将值直接传递到查询中(有时是必要的,但这里不需要)。这样做,您就可以去掉所有可以防止sql注入的好东西。相反,您希望在准备好查询后将它们作为参数发送

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

第三,
fetchAll()
不采用PDO::fetch_ASSOC的“fetch_风格”。
fetch()
采用。但我认为您可以使用fetchAll使用默认设置或无设置。您必须检查这一点,看看您需要什么。以下是

$sql\u sub=“从客户机id=:客户机id和id=:id的菜单配置中选择*”;
$query=$pdo->prepare($sql\u sub);
对于($i=0;$ibindParam(':client\u id',$client\u id));
$query->bindParam(':id',$data[$i]['root\u menu\u id']);
$query->execute();
$data_s=$query->fetchAll();
$sub_menu_title=“”$data[$i]['title']。“”;
if(空($data_s[0]['title'])){
$main\u menu\u title='1
没有主菜单分配给子菜单';
}否则{
$main_menu_title=$data_s[0]['title'];
}
$men_title=$data[$i]['title'];
}

您是否从php/pdo中得到任何异常?您是否只在for语句的最后一次迭代中重写
$main_menu_title
$men_title
?没有异常,我尝试打印($data);在每个循环之后,只返回带有查询的值。如何尝试显式获取单行?
$row=$pdo->query($sql\u sub)->fetch();
然后
print\r($row)
您是否从php/pdo中获得任何异常?您是否仅在for语句的最后一次迭代中重写
$main\u menu\u title
$menu title
?没有异常,我尝试了print\r($data\s);在每次循环之后,只返回带有查询的值。尝试显式获取单行怎么样?
row=$pdo->query($sql_sub)->fetch();
然后
print\r($row)
非常好的重写,使用准备好的语句总是更好、更安全的重写非常好的重写,使用准备好的语句总是更好、更安全的重写
$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'];
}