我有一个问题,我正在循环抛出一组值,然后在每个循环中创建一个 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']
}
}
最佳答案
(这可能比您要求的多一点)
您似乎错过了准备好的语句所做的一些好事。
首先,您通常不想将值直接传递到查询中。 (有时是必要的,但这里不是)。通过这样做,您可以删除所有防止 sql 注入(inject)的好东西。相反,您希望在准备好查询后将它们作为参数发送。
其次,在循环中,如果您通过准备语句一遍又一遍地运行相同的查询,然后使用 PDOStatement::bindParam()
函数。
第三,fetchAll()
不采用 PDO::FETCH_ASSOC 的“fetch_style”。 fetch()
可以。但我认为您可以使用默认设置或不使用 fetchAll。你必须检查一下,看看你需要什么。这里是the fetchAll docs
$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'];
}
关于php - PDO mySql 查询在调用时第二次没有在 for 循环中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2220478/