Mysqli查询仅适用于localhost,而不适用于webserver

时间:2010-03-30 06:54:11

标签: php mysql mysqli

我已经将一些旧的查询更改为Mysqli框架以提高性能。在localhost上一切正常,但是当我将它上传到网络服务器时,它什么也没输出。连接后我检查错误,没有。我还检查了安装的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语句中的调试2行。由于连接细节很好,我真的不明白为什么$ mysqli对象不会被创建。这给任何人任何进一步的想法???

感谢

4 个答案:

答案 0 :(得分:2)

对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();

答案 1 :(得分:1)

MySQL用户权限对主机敏感 - 它可能从localhost和user1从其他主机获得不同的权限。

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

答案 2 :(得分:0)

Mysqli框架不会提高性能 必须在连接后但在每次执行查询后执行错误检查。

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

答案 3 :(得分:0)

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';
            }

希望有所帮助