【问题标题】:Can't get PDO SQL query to work无法使 PDO SQL 查询工作
【发布时间】:2023-03-09 16:37:01
【问题描述】:

我无法让这个查询工作。它只显示第一个数据库条目。任何想法都非常感谢。

/* 准备 */

$sql = "SELECT personal.firstName, personal.lastName, etc. 
        FROM personal 
        LEFT JOIN exam 
        ON personal.P_ID=exam.P_ID 
        LEFT JOIN contact 
        ON exam.P_ID=contact.P_ID 
        WHERE exam.Level = ? 
        AND exam.Centre!='' ORDER BY exam.Centre";

$stmt = $db->prepare($sql);

/* 执行 */ $stmt->执行(数组($level));

/* Fetch */
            $row = $stmt->fetch(PDO::FETCH_ASSOC);    





/*  Display  */
                    echo '<table>
                         <tr>
                    <td>Name</td>
                    <td>Surname</td>
                    <td>Paid?</td>
                    <td>Etc</td>
                    <td>Etc</td>
                    <td>Etc</td>
                        </tr>';

如果($行) { foreach ($row as $key => $value)

              {
                echo '<td>';
                echo $value;
                echo '</td>';
            }
               echo '</tr>';
          }
       echo '</table>';

【问题讨论】:

  • 空字符串不需要绑定参数;我认为另一个应该是exam.Level=:level
  • WHERE exam.Level = :level
  • 我在您的查询中没有看到 :centre 占位符...
  • 谢谢。我修改为exam.Level = :level。 :centre 如果是空字符串,如何使用?

标签: php sql pdo


【解决方案1】:

我也是 PDO 的新手,但从您的代码中我注意到那里的查询中没有 :centre,所以该参数不会绑定?

另一件事在WHERE exam.Level:level,你确定你是这个意思而不是:WHERE exam.Level = :level

【讨论】:

  • 谢谢。我修改为exam.Level = :level,但它仍然不起作用。以及如何将参数用于空字符串?例如exam.Centre!=''
【解决方案2】:

一个简单的教程,让你做对。

  1. 获取有效的 mysql 查询

     $sql = "SELECT * FROM t WHERE a = $a AND b = '$b'";
    
  2. 确保确保它有效。如果没有,请先让它发挥作用。
  3. 取出你在其中插入的每个变量(连同所有相应的格式,包括斜线引号),并打上问号代替他们。

     $sql = "SELECT * FROM t WHERE a = ? AND b = ?";
    
  4. 将这些变量以数组的形式移入execute()

     $sql = "SELECT * FROM t WHERE a = ? AND b = ?";
     $stm = $db->prepare($sql);
     $stm->execute(array($a,$b));
    
  5. 一切正常。

  6. 如果仍然没有 - configure your PDO and PHP in order to see errors if any,请阅读错误消息并采取适当的措施。

要以正确的格式获取数据,您必须使用正确的 fetch 方法

     $data = $stm->fetchAll();
     foreach ($data as $row) {
       echo $row['id'];
       // do whatever
     }

请参考tag wiki for other methods

【讨论】:

  • 另外,如果您将ATTR_EMULATE_PREPARES 设置为true,您可以在execute() 之后使用PDOStatement::debugDumpParams
  • 谢谢。我让它运行,但它只显示数据库中的第一个条目。当然我不需要循环显示所有符合条件的条目?
  • @user2304574 只需使用正确的获取方法。要获取所有条目,您必须使用 $stmt1-&gt;fetchAll() 而不是 fetch() ,它只会获得一条记录
  • fetchAll() 只是擦除我的数据并将其替换为“数组”。
猜你喜欢
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多