2016-05-13 218 views
0

我编码一个项目,并在系统通知错误时遇到一些麻烦: 为foreach()提供的无效参数: foreach($ dbh-> query($ q1)as $行)为foreach提供的参数无效()

并且无法从数据库中获取数据。我如何解决它,即时通讯新手,所以如果我不明白,请教我!谢谢! 感谢您的帮助,但我仍然无法修复它

<?php include("top.html"); ?> 

<body> 

    <div id="main"> 
     <h1>Results for <?php echo $_GET['firstname'] . " " . $_GET['lastname'] ?></h1> <br/><br/> 
     <div id="text">All Films</div><br/> 
     <table border="1"> 
      <tr> 
       <td class="index">#</td> 
       <td class="title">Title</td> 
       <td class="year">Year</td> 
      </tr> 
      <?php 

    $dbh = new PDO('mysql:host=localhost;dbname=imdb_small', 'root', ''); 


    $q1 = "SELECT id 
      FROM actors 
      WHERE first_name = '".$_GET['firstname']."' AND last_name = '".$_GET['lastname']."' 
      AND film_count >= all(SELECT film_count 
            FROM actors 
            WHERE (first_name LIKE'".$_GET['firstname']." %' OR first_name = '".$_GET['firstname']."') 
            AND last_name = '".$_GET['lastname']."')"; 
    $id = null; 

    foreach($dbh->query($q1) as $row){ 
     $id = $row['id'] ; 
    } 
    if($id == null){ 
     echo "Actor ".$_GET['firstname']." ".$_GET['lastname']."not found."; 
    } 
    ` 
       $sql2 = "SELECT m.name, m.year 
       FROM movies m 
       JOIN roles r ON r.movie_id = m.id 
       JOIN actors a ON r.actor_id = a.id 
       WHERE (r.actor_id='".$id."') 
       ORDER BY m.year DESC, m.name ASC"; 

      $i = 0; 
      foreach($dbh->query($sql2) as $row){ 
       echo "<tr><td class=\"index\">"; 
       echo $i+1; 
       echo "</td><td class=\"title\">"; 
       echo $row['name']; 
       echo "</td><td class=\"year\">"; 
       echo $row['year']; 
       echo "</td></tr>"; 
       $i++; 
      } 
      $dbh = null; 
      ?> 

     </table> 

    </div> 
</div> 
<?php include("bottom.html"); ?> 
</body> 
</html> 
+0

您正在使用PDO,为了理智,使用准备好的语句/绑定变量 –

+0

您不检查您的查询是否成功,您只是断言它确实。它似乎不是...... – Arcesilas

回答

0

检查查询迭代的结果之前成功:

if (false !== ($result = $dbh->query($d1))) { 
    foreach($result as $row){ 
     $id = $row['id'] ; 
    } 
} 

顺便说一下,我不明白你用这个毫无意义的循环想要做什么。

-1
$result = $dbh->query($q1); 

foreach($result as $row){$id = $row['id'];} 
+0

如果查询失败,'$ result'将会是'FALSE'。而错误将是相同的。 – Arcesilas

+0

这与OP有什么不同。您只是将结果存储在'$ result'中,而不是直接将它们注入循环中。 – Marcus

0

你能做到这一点

$st = $dbh->query($q1); 
if ($st) { 
    while ($row = $st->fetch()) {} 
} 

Try to make your code more readable

+0

根据文档,'fetch()'方法不是必需的:http://php.net/manual/en/pdo.query.php(请参见示例1)。错误可能是因为查询失败并返回FALSE而不是PDOStatement。 – Arcesilas

+0

如果查询失败,编辑的答案将不起作用...在FALSE上调用fetch()无法工作。在这里,你假设'$ st'是一个'PDOStatement',这似乎不是这种情况。 – Arcesilas

+0

除非我读的问题不好@Arcesilas,但我认为这个问题是,但他在foreach()提供的无效参数形式的错误:foreach($ dbh-> query($ q1)as $ row)不是必要的关于他的查询失败。我可能是错的 – kellymandem

相关问题