【问题标题】:PHP/PDO Select queriesPHP/PDO 选择查询
【发布时间】:2014-01-02 23:00:11
【问题描述】:

我正在使用以下查询从使用 PDO 的 mysql 数据库中选择行。

我正在使用此代码选择多行:

<?php
        $contact = $pdo_conn->prepare("SELECT * from contacts WHERE company_sequence = :company_sequence AND contactstatus = :contactstatus ");
        $contact->execute(array(':contactstatus' => '', ':company_sequence' => $ticket["company"]));
        ?>
        <select name="contactsequence" id="contactsequence">
        <?php foreach($contact as $contacts) {
            echo '<option value="'.$contacts["sequence"].'" ';
            if($ticket["contact"] == $contacts["sequence"]) {
                echo 'selected="selected"';
            }
            echo '>'.$contacts['forename'].' '.$contacts["surname"].'</option>';
        }
        ?>
        </select>

这用于选择单行:

$stmt = $pdo_conn->prepare("select * from tickets where ticketnumber = :seq ");
$stmt->execute(array(':seq' => $_GET["seq"]));
$ticket = $stmt->fetch();

运行 PDO 选择查询的正确方法是什么? (防止sql注入等)我一直在网上找,但我只是想仔细检查一下

【问题讨论】:

  • 抛开其他事情,你已经接近了,但在第一组你试图循环 STMT 语句。可能需要将该 foreach 更改为至少为 foreach ($contact->fetchAll(PDO::FETCH_ASSOC) as $contacts) { /// }。这个问题与错误有关吗?它不工作吗?
  • 我可以做 $contact->fetchAll(PDO::FETCH_ASSOC) 然后将我的循环保留为 foreach($contact as $contacts) { ... }
  • 我对 PDO 很陌生,所以您可能需要耐心等待。我在 2/3 天前开始学习它,哈哈 :)
  • 不,::fetchAll() 的作用是返回一组结果。让它 $results = $contact->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $contact) { /// }
  • 在线文档中有大量示例可帮助您快速掌握。 us3.php.net/manual/en/pdostatement.fetchall.php

标签: php pdo


【解决方案1】:

查理,

出于几个原因,您可以转换为这段代码。答:可读。 B:错误检查

如果你传递一个空的结果集,你的 foreach(...) 会抛出一个错误。 foreach 相信你给它提供了一个合法的数组。

$query = "SELECT *
FROM `contacts`
WHERE `company_sequence` = :companySequence AND
`contactstatus` = :contactStatus";

$stmt = $pdo_conn->prepare($query);
$stmt->execute(array(
    ':contactStatus' => '', 
    ':companySequence' => $ticket["company"])
);

$records = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (!$records) {
    // NO RECORDS FOUND
    die('No records found.');
}

foreach ($records as $contact) {
    // Do what you want with each result
}

这是一种更简洁的处理方式,并提供了一些非常少的错误/未找到结果检查。

【讨论】:

    【解决方案2】:

    您的做法是正确的,尽管我更喜欢将我的数据库内容与 html 输出内容分开。

    您不必获取大型结果集中的所有行,并且可以直接循环遍历 $contact 对象,因为 PDOStatement 对象实现了 Traversable,因此适合使用 foreach 循环进行循环.

    我推荐的一件事是添加错误处理。使用异常,您可以将数据库调用放在 try - catch 块中,以便在出现问题时轻松检测并采取行动。

    【讨论】:

    • 感谢@Jeroen 的更新!我不知道我看过多少次 PDOStatement 文档,却从未接触过 Traversible。这很方便。
    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2020-04-28
    • 2016-10-15
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多