无法在php中获取查询结果

时间:2017-10-09 13:56:55

标签: php mysql pdo

我正在尝试从mysql数据库中获取一些数据。我正在使用PDO +预处理语句,然后将结果作为关联数组提取。数据未显示。

<?php

try {
    $stmt = $conn->prepare("SELECT * FROM bestsellers");
    $stmt->execute();


    while ($result = $stmt->setFetchMode(PDO::FETCH_ASSOC)) {
        echo '<tr class="bestseller-game-template">';
        echo '<td class="col-sm-3">' . $result["title"] . '</td>';
        echo '<td class="col-sm-3">' . $result["genre"] . '</td>';
        echo '<td class="col-sm-3">' . $result["rating"] . '</td>';
        echo '<td class="col-sm-3">' . $result["price"] . '</td>';
        echo '</tr>';
    }
} catch (PDOException $e) {
    echo $e->getMessage();
}
?>

3 个答案:

答案 0 :(得分:0)

设置PDO时,在那里设置获取模式:

$opt = [
PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
        ];
$pdo = new PDO($dsn, $user, $pass, $opt);

然后使用fetch();

获取数据
while($result = $stmt->fetch()){

                        echo ' <tr class="bestseller-game-template">';
                        echo '<td class="col-sm-3">'.$result["title"].'</td>';
                        echo '<td class="col-sm-3">'.$result["genre"].'</td>';
                        echo '<td class="col-sm-3">'.$result["rating"].'</td>';
                        echo '<td class="col-sm-3">'.$result["price"].'</td>';
                        echo '</tr>';
                    }

答案 1 :(得分:0)

您可以查看here以获取更多信息 试试这个:

$stmt->setFetchMode(PDO::FETCH_ASSOC);
while($result = $stmt->fetch()) {
    echo ' <tr class="bestseller-game-template">';
    echo '<td class="col-sm-3">'.$result["title"].'</td>';
    echo '<td class="col-sm-3">'.$result["genre"].'</td>';
    echo '<td class="col-sm-3">'.$result["rating"].'</td>';
    echo '<td class="col-sm-3">'.$result["price"].'</td>';
    echo '</tr>';
}

答案 2 :(得分:0)

正如其他用户已发布的那样,PDOStatement::setFetchMode仅为预准备语句设置默认获取模式。它必须是PDO::FETCH_*常量之一,如PDOStatement::fetch的文档中所述。

为了从db表中获取记录,您可以在fetch()语句中调用while,或直接调用fetchAll()

  • 从技术上讲,fetch()方法仅用于获取一条记录。但是,通过应用while语句,您告诉PHP引擎在每个迭代步骤中获取新记录。
  • fetch()相比,fetchAll()方法旨在一次获取多个记录。 A test说,“它更快,但需要更多内存”。如果测试令你信服,由你来决定。

无论如何,由于您尝试获取多条记录,我建议使用fetchAll方法。我个人选择的理由是,这样可以避免使用while语句。我总是试图在我的代码中完全避免while语句,因为它们可以产生无限循环。但这并不意味着你不应该使用它们。但要小心使用它们。

现在,fetchAll()方法的第一个参数是fetch_style。它完全对应于setFetchMode()的参数和fetch()方法的第一个参数。因此,请再次详细阅读PDOStatement::fetch的参数列表,以便了解它可以采用的值。

此外,我建议您尝试将提取代码与演示代码分开。获取数组中所需的所有数据,然后照常迭代它们,以便格式化显示结果。如果可能的话,尽量避免从PHP代码构建HTML元素。

最后,这是一个非常好的PDO教程:(The only proper) PDO tutorial

祝你好运!

<?php
try {
    // Connect to db.
    $conn = new PDO(
            'mysql:host=localhost;port=3306;dbname=books;charset=utf8'
            , 'yourusername'
            , 'yourpassword'
            , array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::ATTR_PERSISTENT => true,
            )
    );

    // Prepare and execute query.
    $sql = 'SELECT * FROM bestsellers';
    $stmt = $conn->prepare($sql);
    $stmt->execute();

    // Get the result set as an associative array.
    $bestsellers = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $exc) {
    echo $exc->getMessage();
    exit();
} catch (Exception $exc) {
    echo $exc->getMessage();
    exit();
}
?>

<table>
    <?php
    foreach ($bestsellers as $bestseller) {
        $title = $bestseller['title'];
        $genre = $bestseller['genre'];
        $rating = $bestseller['rating'];
        $price = $bestseller['price'];
        ?>
        <tr class="bestseller-game-template">
            <td class="col-sm-3">
                <?php echo $title; ?>
            </td>
            <td class="col-sm-3">
                <?php echo $genre; ?>
            </td>
            <td class="col-sm-3">
                <?php echo $rating; ?>
            </td>
            <td class="col-sm-3">
                <?php echo $price; ?>
            </td>
        </tr>
        <?php
    }
    ?>
</table>