我有这个代码,在循环一次时工作正常。
<!-- 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;
}
?>
答案 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);
答案 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;
}
}
?>