我已经将一些旧的查询更改为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对象不会被创建。这给任何人任何进一步的想法???
感谢
答案 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';
}
希望有所帮助