Запрос Mysqli работает только на локальном хосте, а не на веб-сервере
Вопрос
Я изменил некоторые из своих старых запросов на платформу 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...
}
Таким образом, по сути, он должен вывести «отладку 1» до того, как будет подготовлен оператор (что и происходит).Затем после этого он должен вывести «отладку 2» и все возникшие ошибки.
Проблема где-то здесь, поскольку она не достигает строки отладки 2 в операторе IF.Поскольку детали соединения в порядке, я не могу понять, почему объект $mysqli не создается.Это даст кому-нибудь еще идеи???
Спасибо
Нет правильного решения
Другие советы
Каждый вызов метода 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();
Разрешение пользователя MySQL зависит от хоста — оно может давать пользователю user1 с локального хоста и пользователю user1 с другого хоста разные разрешения.
GRANT ALL ON *.* TO user@'%' IDENTIFIED BY 'password';
Фреймворк Mysqli не повышает производительность.
Проверка ошибок должна выполняться не только после подключения, но и после выполнения каждого запроса.
Проверять $stmt->error
на ошибки
Или попробуйте проверить выброшенное исключение
Является 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';
}
надеюсь, это поможет