PHP / PDO选择查询

时间:2014-01-02 23:00:11

标签: php pdo

我使用以下查询从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注入等)我一直在网上看,但我只想仔细检查

2 个答案:

答案 0 :(得分: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
}

这是一种更简洁的方法,可以提供一些非常小的错误/没有找到结果。

答案 1 :(得分:1)

你这样做的方式是正确的,虽然我更喜欢将我的数据库内容与html输出内容分开。

您不必获取大结果集中的所有行,并且可以直接在$contact对象上循环,因为PDOStatement对象实现了Traversable,使其适合循环使用foreach循环。

我建议的一件事是添加错误处理。使用例外,您可以将数据库调用放在try - catch块中,以便在出现问题时轻松检测并采取措施。