准备好的声明,重新使用时失败

时间:2016-08-08 11:04:52

标签: php mysqli

我有这个代码,在循环一次时工作正常。

<!-- language: php -->
<?php
$query = "SELECT username FROM users WHERE user_id = ? LIMIT 1";
$stmt = $con->prepare($query) or die(mysqli_error($con));
$stmt->bind_param("s", $user_id);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($username);
?>

当我第一次在页面上调用它时,它会正常加载并且数据会显示出来。

<!-- language: php -->
<?php
    // This one works fine.
        while ($stmt->fetch()){
        echo 'Welcome '.$username;
        }
    ?>

如果我想在其他地方重复使用相同的查询,则无法解决错误。我做错了吗?在同一页面上多次重复使用同一查询的正确方法是什么,由于数据相同,我不想每次都重新查询数据库。

<!-- language: php -->
<?php
// When re-used somewhere else on the page, it fails. Nothing shows.
    while ($stmt->fetch()){
    echo 'Welcome '.$username;
    }
?>

5 个答案:

答案 0 :(得分:1)

fetch一个接一个地返回。获取所有行后,对fetch()方法的任何进一步调用都将返回false

您需要重新execute()查询才能再次获得相同的结果。这将再次调用数据库。如果要缓存结果,则需要将其放入一些内存缓存/全局变量/您喜欢的任何内容。

如果您真的想再次到达结果集的开头,可以使用mysqli_data_seek()

mysqli_data_seek($stmt, 0);
while ($stmt->fetch()){
    echo 'Welcome '.$username;
}

答案 1 :(得分:0)

您可以将查询结果提取到包含$users = $stmt->fetchAll(); // this works foreach($users as $user) { echo 'Welcome ' . $username; } // this works again foreach($users as $user) { echo 'Welcome ' . $username; }

的数组中
(function( $ ) {
    "use strict";
    var $container = $('.masonry-container');
    $container.imagesLoaded( function () {
        $container.masonry({
          columnWidth: '.item',
          percentPosition: true,
          itemSelector: '.item'
        });
    });

    $( document ).on( 'js_event_wpv_pagination_completed', function( event, data ) {
        $container.masonry('reloadItems').masonry();
    });

    $( document ).on( 'js_event_wpv_parametric_search_results_updated', function( event, data ) {
        $container.masonry('reloadItems').masonry();    
    });

    $( document ).on( 'js_event_wpv_pagination_completed', function( event, data ) {
        $container.masonry('reloadItems').masonry();
        $container.imagesLoaded( function() {
          $container.masonry();
        });
    });

    $( document ).on( 'js_event_wpv_parametric_search_results_updated', function( event, data ) {
        $container.masonry('reloadItems').masonry();
        $container.imagesLoaded( function() {
          $container.masonry();
        });
    });

})(jQuery);

此处提供更多信息:http://php.net/manual/fr/pdostatement.fetchall.php

答案 2 :(得分:0)

您可以做的是将结果集作为 ASSOC数组并将结果保存在变量中。现在,您可以根据需要多次使用此数组。

像这样更新你的代码,

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

foreach ($results as $r) {
    //first time use
}

foreach ($results as $r) {
    //second time use
}

答案 3 :(得分:0)

我需要拆分代码以实现MySQL(i)所需的功能。 感谢您的投入。

<?php
// Preparing the statement
$query = "SELECT username FROM users WHERE user_id = ? LIMIT 1";
$stmt = $con->prepare($query) or die(mysqli_error($con));
$stmt->bind_param("s", $user_id);
$stmt->store_result();
?>


<?php
// Executing it when needed and creating some variables for later re-use
    $stmt->execute();
    $stmt->bind_result($username);
    while ($stmt->fetch()) {
    $new_username = $username;
    echo 'Welcome '.$new_username;
    }
?>

<?php
// It is possible now to re-use the same result set
    echo 'Welcome '.$new_username;
?>

答案 4 :(得分:0)

您可以存储结果:

<?
$query = "SELECT username FROM users WHERE user_id = ? LIMIT 1";
$stmt = $con->prepare($query) or die(mysqli_error($con));
$stmt->bind_param("s", $user_id);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($col['username']);

$result = array();
for ($i = 0; $i < $stmt->num_rows; $i++){
    $stmt->data_seek($i);
    $stmt->fetch();
    foreach ($col as $key => $value){
        $result[$i][$key] = $value;
    }
}
?>