2010-03-30 4 views
0

J'ai changé certaines de mes anciennes requêtes en framework Mysqli pour améliorer les performances. Tout fonctionne correctement sur localhost mais quand je le télécharge sur le serveur web, il ne produit rien. Après la connexion je vérifie les erreurs et il n'y en a pas. J'ai également vérifié les modules php installés et mysqli est activé.La requête Mysqli ne fonctionne que sur localhost, et non sur webserver

Je suis certain qu'il crée une connexion à la base de données car aucune erreur n'est affichée. (Quand je l'ai changé la chaîne de nom de la base, il a donné l'erreur)

Il n'y a pas de sortie de la requête sur le serveur web, qui ressemble à ceci:

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

Comme je l'ai dit ce code fonctionne parfaitement sur mon localserver juste pas en ligne. Vérifié les journaux d'erreurs et il n'y a rien, donc tout indique une bonne connexion. Toutes les tables existent aussi etc ... N'importe qui a des idées parce que celui-ci m'a coincé! Aussi, si je fais fonctionner cela, toutes mes autres requêtes fonctionneront-elles encore? Ou devrais-je les obliger à utiliser le framework mysqli? Merci d'avance.

EDIT:

Ok Ive fait quelques 'débogage' pour voir ce qui se passe. Il y a des données dans la table que j'interroge qui correspond à la requête. Je l'ai fait comme suit pour vérifier l'instruction de préparation:

echo "debug 1"; 

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

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

etc... 
} 

Donc, fondamentalement, il doit envoyer debug 1 'avant la statment est préparé (ce qu'il fait). Puis après il devrait sortir 'debug 2' et toutes les erreurs qui se sont produites.

Le problème est ici quelque part car il n'atteint pas la ligne de débogage 2 dans l'instruction IF. Puisque les détails de connexion sont bien, je ne peux pas vraiment voir pourquoi l'objet $ mysqli ne serait pas créé. Cela donne à quelqu'un d'autres idées ???

merci

+1

Où sélectionnez-vous la base de données? C'est soit le quatrième paramètre du constructeur, soit un appel à mysqli :: select_db. – VolkerK

+0

Eh bien, vous frappez le clou sur la tête VolkerK. J'utilisais les trois paramètres de connexion de l'ancien mode de connexion.Celui que j'ai téléchargé ne sélectionnait pas la base de données, mais sur le serveur local, il était sélectionné à partir d'un appel vers un autre script de connexion. Merci à tous pour vos commentaires, ils sont les bienvenus. – whamo

Répondre

0

Le framework Mysqli n'améliore pas les performances.
La vérification des erreurs doit être effectuée non seulement après la connexion, mais après l'exécution de chaque requête.

Vérifiez $stmt->error pour les erreurs
Ou essayez de vérifier contre Throwed exception

+0

mysqli peut améliorer les performances si vous appelez des procédures stockées avec lui. J'ai fait beaucoup de repères comparant les appels sprocs v. Inline sql et vous obtiendrez beaucoup plus de débit avec des frais généraux plus bas en les utilisant. –

+0

@ f00 comment cela peut-il être que la méthode * call * affecte les * calculs internes *? –

+0

Merci pour les réponses les gars. Je l'utilise pour stocker des requêtes qui seront exécutées plusieurs fois, en passant des identifiants d'utilisateur différents, etc., ce qui devrait améliorer les performances. Quoi qu'il en soit, j'ai vérifié les erreurs STMT et il n'y avait pas de sortie. C'est un mystère pour moi. S'il vous plaît, veuillez aider quelqu'un! Salutations – whamo

2

Chaque appel à une méthode mysqli/stmt peut échouer. Vous devriez vérifier chacun d'eux.
Essayez avec error_reporting (E_ALL) et peut-être 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

permission utilisateur MySQL est l'hôte sensible - il peut donner user1 de localhost et user1 d'autres hôte différent autorisation.

GRANT ALL ON *.* TO [email protected]'%' IDENTIFIED BY 'password'; 
0

Est-Id un entier? Je lance normalement mes mysqli comme

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

espoir qui aide

Questions connexes