【问题标题】:Mysqli query only works on localhost, not webserverMysqli 查询仅适用于本地主机,不适用于网络服务器
【发布时间】:2010-03-30 06:54:11
【问题描述】:

我已将一些旧查询更改为 Mysqli 框架以提高性能。在本地主机上一切正常,但是当我将它上传到网络服务器时,它什么也没输出。连接后我检查错误,没有。我还检查了安装的 php 模块并启用了 mysqli。

我确信它会创建与数据库的连接,因为没有显示任何错误。 (当我更改数据库名称字符串时,它给出了错误)

网络服务器上的查询没有输出,如下所示:

$mysqli = new mysqli("server", "user", "password");

if (mysqli_connect_errno()) {
   printf("Can't connect Errorcode: %s\n", mysqli_connect_error());
   exit;
}

// Query used  
$query = "SELECT name FROM users WHERE id = ?";

if ($stmt = $mysqli->prepare("$query")) 
{

    // Specify parameters to replace '?'
    $stmt->bind_param("d", $id);  

    $stmt->execute();

    // bind variables to prepared statement 
    $stmt->bind_result($_userName);

    while ($stmt->fetch()) 
    {
          echo $_userName;
    }


    $stmt->close();
 }
}

//close connection 
$mysqli->close(); 

正如我所说,这段代码在我的本地服务器上完美运行,只是不在线。检查了错误日志,没有任何东西,所以一切都表明连接良好。所有的表都存在等等。任何人都有任何想法,因为这个让我卡住了!另外,如果我得到这个工作,我所有的其他查询仍然有效吗?或者我是否需要让他们也使用 mysqli 框架?提前致谢。

编辑:

好的,我已经进行了一些“调试”以查看发生了什么。我正在查询的表中有与查询匹配的数据。我做了以下检查准备语句:

echo "debug 1";

if ($stmt = $mysqli->prepare("$shiftQuery"))  
{

echo "debug 2";
printf("Error: %s.\n", $stmt->error);

etc...
}

所以基本上它应该在准备好语句之前输出'debug 1'(它确实如此)。然后它应该输出'debug 2'和发生的任何错误。

问题出在某处,因为它没有到达 IF 语句中的 debug 2 行。由于连接细节很好,我真的不明白为什么 $mysqli 对象不会被创建。这给任何人任何进一步的想法???

谢谢

【问题讨论】:

  • 你在哪里选择数据库?它要么是构造函数的第四个参数,要么是对 mysqli::select_db 的调用。
  • 好吧,你打中了 VolkerK 的头。我使用的是旧连接方式中的三个连接参数。我上传的那个没有选择数据库,但是在本地服务器上,它是从对另一个连接脚本的调用中选择的。谢谢大家的cmets,非常欢迎他们。

标签: php mysql mysqli


【解决方案1】:

对 mysqli/stmt 方法的每次调用都可能失败。你应该检查每一个。
试试 error_reporting(E_ALL) 或者 display_error=On

<?php
error_reporting(E_ALL); ini_set('display_errors', 1);

// passing database name as fourth parameter
$mysqli = new mysqli("server", "user", "password", 'dbname');
if (mysqli_connect_errno()) {
   printf("Can't connect Errorcode: %s\n", mysqli_connect_error());
   exit;
}

// Query used  
$query = "SELECT name FROM users WHERE id = ?";

if ( false===($stmt=$mysqli->prepare("$query")) ) {
  echo 'mysqli::prepare failed: ', htmlspecialchars($mysqli->error);
  die;
}

// Specify parameters to replace '?'
$rc = $stmt->bind_param("d", $id);  
if ( !$rc ) {
  echo 'bind_param failed: ', htmlspecialchars($stmt->error);
  die;
}

echo '<pre>Debug: execute()</pre>';
$rc = $stmt->execute();
if ( !$rc ) {
  echo 'execute failed: ', htmlspecialchars($stmt->error);
  die;
}

echo '<pre>Debug: bind_result()</pre>';
// bind variables to prepared statement 
$rc = $stmt->bind_result($_userName);
if ( !$rc ) {
  echo 'bind_result failed: ', htmlspecialchars($stmt->error);
  die;
}

echo '<pre>Debug: fetch()</pre>';
while ($stmt->fetch()) 
{
  echo 'username: ', $_userName;
}
echo '<pre>Debug: stmt close()</pre>';
$stmt->close();

echo '<pre>Debug: mysqli close()</pre>';
$mysqli->close();

【讨论】:

    【解决方案2】:

    MySQL 用户权限是主机敏感的——它可能赋予来自 localhost 的 user1 和来自其他主机的 user1 不同的权限。

    GRANT ALL ON *.* TO user@'%' IDENTIFIED BY 'password';
    

    【讨论】:

      【解决方案3】:

      Mysqli 框架并没有提高性能。
      错误检查不仅必须在连接之后进行,而且必须在每次查询执行之后进行。

      检查$stmt-&gt;error 是否有错误
      或者尝试检查抛出的异常

      【讨论】:

      • mysqli 如果使用它调用存储过程,可以提高性能。我已经完成了大量比较 sprocs 与内联 sql 调用的基准测试,使用它们您将获得更高的吞吐量和更低的开销。
      • @f00 call 方法怎么会影响内部计算
      • 感谢大家的回复。我正在使用它来存储将多次运行的查询,传递不同的用户 ID 等,因此它应该有助于提高性能。无论如何,我检查了stmt错误并且没有输出。这对我来说是个谜。请有人帮忙!干杯
      • @whamo 不,存储查询不会提高性能。如果您通过传递不同的用户 ID 来消除许多查询,那么您将对其进行更多改进。它必须是一个查询,这将是真正的性能改进。至于您的问题 - 很简单:表中没有数据与您的查询匹配。
      【解决方案4】:

      Id 是整数吗?我通常像运行我的 mysqli 一样

      $sql = "SELECT name FROM users WHERE id = ?";
                  if($stmt = $mysqli->mysqli->prepare($sql)){
                    $stmt->bind_param("i", $id);
                          if($stmt->execute()){
                              $stmt->bind_result($name);
                              $stmt->store_result();
                              if($stmt->fetch()){
                                  return $name;
                               }else{
                                   return 'Not Found';
                               }      
                          }else{
                              return 'Execute Error';
                          }
      
                  }else{
                      return 'SQL Error';
                  }
      

      希望有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多