La difficulté de l'exécution d'une requête SELECT dans une déclaration préparée à l'avance
Ive suivi un tas de différents exemples concernant l'utilisation d'un SELECT dans une déclaration préparée à l'avance, mais rien n'est renvoyé.
MODIFIER j'ai changé mon code un peu à ressembler à ceci:
$date1 = 2012-01-01;
$date2 = 2012-01-31;
$sql_con = new mysqli('db', 'username', 'password', 'database');
if($stmt = $sql_con->prepare("SELECT eventLogID FROM Country WHERE countryCode=? AND date BETWEEN ? AND ?")){
$stmt->bind_param("sss", $country_code, $date1,$date2);
$stmt->execute();
$i=0;
while ($stmt->fetch()){
$stmt->bind_result($row[$i]);
$i++;
}
$stmt->close();
$sql_con->close();
Maintenant toutes les entrées, à l'exception de la première, sont ajoutés à $row[]. Pourquoi n'est pas la première entrée ajoutés?
Merci à l'avance!
Vous utilisez * dans votre requête, mais $ligne dans votre bind_result($row). bind_result doit contenir les colonnes, je pense. Lire la suite ici: nl3.php.net/manual/en/mysqli-stmt.bind-result.php de Sorte que votre $row variable contient la première colonne de ce qu'elle est * moyens. (Éviter * dans toutes vos requêtes, mais c'est un autre sujet).
OriginalL'auteur Glenncito | 2012-07-20
Vous devez vous connecter pour publier un commentaire.
MODIFIER 07/2015 (la question a été modifié depuis la réponse, mais les principes sous-jacents sont les mêmes)
Jamais
SELECT *
dans un environnement de production, il ne fera que revenir à vous mordre dans bizarre, imprévisible et apparemment sans rapport avec les moyens. En spécifiant les colonnes que vous souhaitez, vous devrez vous assurer que la colonne de commande, type de données, de contrainte et de toutes sortes d'autres éléments ne sera pas vous causer des problèmes à long terme.Cette réponse est encore valide, donc je vais le laisser ici, mais le principal à emporter est: utiliser PDO, il n'98% des choses que vous aurez jamais besoin avec une présentation plus claire et plus concise de l'API au cours de la même fin. Si vous avez besoin d'un plus complexe SGBDR API spécifique, alors vous aurez déjà de comprendre les problèmes que vous avez et pourquoi vous avez besoin de mysqli, etc au lieu de cela.
SELECT *
ne fonctionne pas très bien avec MySQLi déclarations préparées à l'avance. C'est l'une des principales raisons, je recommande AOP au lieu - que et le ridicule exigence de lier les références à des variables au lieu de valeurs pour les paramètres.Ce n'est pas contraignant, le résultat ligne à une variable, il serait juste de la liaison d'une seule colonne. Et parce que vous avez utilisé
SELECT *
, il ne fait pas ce que vous souhaitez.Si vous ne souhaitez utiliser MySQLi plus de PDO (qui, comme je l'ai dit, je vous recommande) il y a quelques bons exemples de la façon de
SELECT *
dans les commentaires comme cette une sur lebind_result()
page de manuel.Ou vous pouvez simplement spécifier les colonnes que vous souhaitez récupérer:
MODIFIER en fonction de votre nouveau code, vous devez faire ceci:
Voir modifier ci-dessus
Je suis également du mal avec ça, en faisant un select de la requête préparée juste ne fonctionne pas, qu'est-ce exactement avez-vous finir à la fin?
OriginalL'auteur DaveRandom
Je pense que vous devez lier les colonnes de bind_results() comme
Ici $col1 et $col2 se lie à Code et le Nom des colonnes de la table Country
(Au lieu de * SÉLECTIONNEZ utiliser les noms de colonne)
Autre référence : http://php.net/manual/en/mysqli-stmt.bind-result.php
OriginalL'auteur Makesh