【问题标题】:'foreach' query works on Localhost but not on Server - PHP, MySQLi'foreach' 查询适用于 Localhost 但不适用于服务器 - PHP、MySQLi
【发布时间】:2014-01-04 17:43:17
【问题描述】:

下面这个查询在 localhost (PHP/5.4.22)

<?php
global $db;    
$query = $db->query("SELECT * FROM player WHERE playerID = '181783'") or die(mysqli_error($db));                
foreach ($query as $row) {
    $fName = $row['fName'];
    echo "First Name: " . $fName;    
}           
?>

在我的虚拟主机上怎么样 (PHP/5.3.28)

这个查询返回

名字:名字:名字:名字:名字:

目前只有 1 个结果返回其中 playerID = 181783,并且应该回显名称“Mario”

当我在我的虚拟主机上运行如下查询时,它可以正常工作并与 Mario 相呼应。

$query2 = $db->query("SELECT * FROM player WHERE playerID = '181783'");                             
$result = $query2->fetch_object();                
echo $result->fName;

所以这一定意味着数据库连接设置正确,因为 query2 在同一页面上并且正在工作,只是由于某种原因,查询一个它不会回显结果,而是显示 'First Name:' 5 次。

对于我在整个站点中使用的所有 foreach() 函数都是这样,所以我不能只查询 2。

总之,这两个查询都在本地主机上工作,当上传到我的网络主机时,只有查询 2 工作。

尽管有 error_reporting(E_ALL); 但没有错误正在启用

我该怎么办? 谢谢。

编辑-数据库配置

//MySQLI configuration
$_CONFIG['mysql']['hostname'] = 'localhost';
$_CONFIG['mysql']['username'] = '#';
$_CONFIG['mysql']['password'] = '#';
$_CONFIG['mysql']['database'] = '#';

//Initialize MySQLi connection
$db = new mysqli($_CONFIG['mysql']['hostname'], $_CONFIG['mysql']['username'], $_CONFIG['mysql']['password'], $_CONFIG['mysql']['database']);
if ($db->connect_errno) {
    die("MySQLi error: ".$db->connect_error);
}

【问题讨论】:

  • print_r($row) 说什么?您确定两台服务器上的表数量相同吗?
  • 也许在这里显示你的数据库配置文件会有所帮助。
  • print_r($fName) 再次没有返回任何内容,我已将我的数据库配置添加到帖子中。
  • 数据库配置不是问题,检查我的回答:Mysqli_Result 在 5.4 版之前没有实现 Travesrable,您的网络服务器正在运行 5.3。就这样。使用while 循环可以解决问题,升级服务器也是如此

标签: php mysqli localhost


【解决方案1】:

问题只是mysqli::query 返回了mysqli_result 类的一个实例,它在PHP 5.4 出现之前没有实现Traversable 接口(@98​​7654321@ 在更改日志中)。
您自己承认您的虚拟主机正在运行 5.3:"webhost (PHP/5.3.28)",因此您的代码将无法工作,因为 $query 的值(这不是查询但结果集)不可迭代。

只需将代码更改为我们都习惯看到的内容:

$result = $db->query('Your query here');
if (!$result) throw new Exception('Query Failed!');
while($row = $result->fetch_assoc())
{
    echo 'First name: ', $row['fName'];
}

工作完成。

注意事项:
这确实解决了问题,但您最好升级您的服务器,或者至少 一个复制生产环境的测试环境!

我还注意到您的代码中的or die。请不要这样做,尤其是在生产/现场环境中。谷歌“或死必死”。这是一个过时的构造。除了向客户显示系统的错误消息外,它具有代码气味,并没有真正任何事情。这不好。

【讨论】:

  • @user1626410:请注意:每当您遇到代码在一个环境中工作,但在另一个环境中失败时:检查phpinfo() 的输出并比较启用/安装的扩展,然后检查版本,并检查更改日志在 php.net 上。将这两个步骤视为您对硬件所做的基本检查表:电缆连接是否正确并且设备是否明显损坏
【解决方案2】:

试试这个,需要加$rows = $query-&gt;fetch_array();

 $query = $db->query("SELECT * FROM player WHERE playerID = '181783'") or die(mysqli_error($db));    
$rows = $query->fetch_array();              
foreach ($rows as $row) {

【讨论】:

    【解决方案3】:
    Your first code snippet $query  only executes query :
    

    你不见了 $query->fetch_object();

    示例

    $query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
    
    if ($result = $mysqli->query($query)) {
    
        /* fetch object array */
        while ($obj = $result->fetch_object()) {
            printf ("%s (%s)\n", $obj->Name, $obj->CountryCode);
        }
    
        /* free result set */
        $result->close();
    }
    

    【讨论】:

    • 你没有解释为什么第一个 sn-p 实际上 在 OP 的本地主机上工作mysqli::query 返回 mysqli_result 的实例,因为 PHP 5.4 实现了 Traversable,所以可以在其上使用迭代器。服务器运行版本 5.3。我的回答中提供了支持这一点的文档的链接
    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 2020-09-03
    • 2012-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2019-09-09
    • 2015-07-18
    相关资源
    最近更新 更多