2017-10-17 7 views
0

J'ai une instruction MySQL qui ne fonctionnera pas pour moi. J'ai vérifié plusieurs parties du code mais il continue de renvoyer null comme le résultat. J'ai également essayé de remplacer le WHERE enc_mail = AND enc_public_id=" to "WHERE 1" pour vérifier si c'était un problème avec les variables, mais ce n'est pas le cas. Je n'ai pas eu d'erreurs non plus.Mon instruction MySQL préparée ne fonctionnera pas

$connect_db = mysqli_connect("myhost","my username","my password","my db"); 

    $mail_id = crypto(mysqli_real_escape_string($connect_db,htmlspecialchars($_GET['em'])),'e'); 
    $public_id = mysqli_real_escape_string($connect_db,htmlspecialchars($_GET['public'])); 
    $active_true = true; 
    $check = $connect_db->prepare("SELECT active FROM enc_data WHERE enc_mail=? AND enc_pub_id=?"); 
    $check->bind_param("ss", $mail_id, $public_id); 
    $active = $check->execute(); 

     if($active[0]==""){ 
     //It goes here once the code is run 
    } 
+0

Je ne vous vois pas vérifier les erreurs ici. – Akintunde007

+1

Il n'y a absolument aucune raison d'utiliser les deux variables paramétrées 'real_escape_string()' ** _ et _ **. Les variables paramétrées suffisent à elles seules :) Cela inclut tout autre nettoyage de chaîne, rien de nécessaire si vous utilisez des variables paramétrées. Se débarrasser de tout cela va certainement aider la lisibilité de votre code. – GrumpyCrouton

+0

@garethpower S'il vous plaît rajouter la partie de journalisation des erreurs que nous voyons comment vérifier les erreurs – Progman

Répondre

1

Vous devez appliquer bind_result puis fetch

Aussi il n'y a absolument aucune raison de escape_string lors de l'utilisation des instructions préparées comme @GrumpyCrouton dit

je vous recommande de passer à PDO car il est plus simple

+0

ouais. Je viens d'apprendre quelque chose de nouveau. Merci :) – Akintunde007

+1

Hey si vous êtes un fan de PDO, vous devriez vérifier la [classe que j'ai écrit] (https://github.com/GrumpyCrouton/GrumpyPDO) et laissez-moi savoir si vous voyez quelque chose que je peux faire mieux – GrumpyCrouton

+0

1) Comme il est mentionné dans les docs: http://www.php.net/manual/en/mysqli-stmt.fetch.php 2) habituellement d'abord modifier/crypt/quelque chose une chaîne et puis/échapper enfin, sauf quand en utilisant comme paramètre à une requête préparée 3) +1 pour PDO :-) – clemens321

1

Je suis d'accord avec @Akintunde que vous ne devriez pas utiliser et échapper htmlspecialchars sur les paramètres de la requête. L'échappement est redondant lorsque vous utilisez des paramètres de requête. htmlspecialchars est juste quand vous sortie contenu au format HTML, pas pour l'entrée à SQL.

Vous ne devez pas nécessairement utiliser bind_result() pour une requête mysqli. Vous pouvez obtenir un objet résultat à partir de l'instruction préparée, puis utiliser les méthodes d'extraction sur l'objet résultat pour obtenir des lignes successives.

Voilà comment j'écrire votre code:

// makes mysqli throw exceptions if errors occur 
mysqli_report(MYSQLI_REPORT_STRICT); 

$connect_db = new mysqli("myhost", "my username", "my password", "my db"); 

$mail_id = $_GET['em']; 
$public_id = $_GET['public']; 
$active_true = true; 
$sql = "SELECT active FROM enc_data WHERE enc_mail=? AND enc_pub_id=?"; 
$stmt = $connect_db->prepare($sql); 
$stmt->bind_param("ss", $mail_id, $public_id); 
$stmt->execute(); 
$result = $stmt->get_result(); 
while ($row = $result->fetch_assoc()) { 
    if($row["active"]==""){ 
     //It goes here once the code is run 
    } 
} 

Mais en fait, je préférerais utiliser PDO au lieu de mysqli, donc je suppose que ce n'est pas vraiment comment j'écrire le code de l'OP. :-)

+0

Il est à noter que get_result n'est pas garanti d'être disponible ce qui pourrait poser problème –

+0

@YourCommonSense, autant que je sache 'get_result()' nécessite le pilote ** mysqlnd **, puis il est disponible. Y at-il une autre raison pour laquelle il ne serait pas disponible? –

+0

Oui, c'est exactement la raison. –