Pergunta

Alterei algumas das minhas consultas antigas para o framework Mysqli para melhorar o desempenho.Tudo funciona bem no localhost, mas quando eu carrego no servidor web, ele não produz nada.Depois de conectar, verifico se há erros e não há nenhum.Também verifiquei os módulos php instalados e o mysqli está habilitado.

Tenho certeza de que ele cria uma conexão com o banco de dados, pois nenhum erro é exibido.(quando mudei a string do nome do banco de dados deu o erro)

Não há saída da consulta no servidor web, que se parece com isto:

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

Como eu disse, esse código funciona perfeitamente no meu servidor local, mas não online.Verifiquei os logs de erros e não há nada, então tudo aponta para uma boa conexão.Todas as tabelas também existem etc.Alguém tem alguma ideia porque esta me deixou preso!Além disso, se eu fizer isso funcionar, todas as minhas outras consultas ainda funcionarão?Ou precisarei fazê-los usar o framework mysqli também?Desde já, obrigado.

EDITAR:

Ok, fiz algumas 'depurações' para ver o que está acontecendo.Há dados na tabela que estou consultando que correspondem à consulta.Fiz o seguinte para verificar a instrução de preparação:

echo "debug 1";

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

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

etc...
}

Então, basicamente, ele deve gerar 'debug 1' antes que a instrução seja preparada (o que acontece).Depois, deverá gerar 'debug 2' e quaisquer erros que tenham ocorrido.

O problema está aqui em algum lugar, pois não atinge a linha de depuração 2 na instrução IF.Como os detalhes da conexão estão corretos, não consigo entender por que o objeto $ mysqli não seria criado.Isso dá a alguém mais alguma ideia???

obrigado

Nenhuma solução correta

Outras dicas

Cada chamada para um método mysqli/stmt pode falhar.Você deve verificar cada um deles.
Experimente com error_reporting(E_ALL) e talvez 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();

A permissão do usuário do MySQL é sensível ao host - pode fornecer ao usuário1 do localhost e do usuário1 de outros hosts diferentes permissão.

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

O MySQLI Framework não melhora o desempenho.
A verificação de erros deve ser feita não apenas após a conexão, mas após cada consulta executar.

Verificar $stmt->error para erros
Ou tente verificar contra a exceção de arremesso

É Id um número inteiro? Eu normalmente corro meu mysqli como

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

espero que ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top