Запрос Mysqli работает только на локальном хосте, а не на веб-сервере

StackOverflow https://stackoverflow.com/questions/2543324

  •  23-09-2019
  •  | 
  •  

Вопрос

Я изменил некоторые из своих старых запросов на платформу 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';
            }

надеюсь, это поможет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top