2009-06-19 8 views
3

S'il vous plaît pardonnez-moi la possibilité de la stupidité de cette question, mais je viens de commencer à utiliser des déclarations préparées. Je sais que cette requête particulière fonctionne, comme je l'ai testé avec des méthodes procédurales non préparées. Le voici:Déclaration préparée ne retournant rien

$name = 'introduction'; 
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.'); 
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?"); 
$stmt->bind_param('s', $name); 
$stmt->execute(); 
$stmt->bind_result($content); 
$stmt->fetch(); 
echo $content; 
$stmt->close(); 

Un conseil ou des points dans la bonne direction sont grandement appréciés!

EDIT 1: Juste une mise à jour sur mes progrès que j'essaye de dépanner. Je me suis rendu compte que, puisque j'ai une colonne id comme index dans la table des sections, j'ai dû lier cela en conséquence, étant donné la déclaration ci-dessus sur php.net, (merci encore, Bill).

Voici le nouveau code:

$name = 'introduction'; 
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.'); 
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?"); 
$stmt->bind_param('s', $name); 
$stmt->execute(); 
$stmt->bind_result($id, $name, $content); 
$stmt->fetch(); 
echo $content; 
$stmt->close(); 

Merci encore à tous ceux qui peuvent offrir des suggestions. (Je suis curieux: je trouve qu'il est difficile de débogage lorsque vous utilisez le style POO des déclarations préparées de cette manière est là, par exemple, un moyen facile de voir simplement la requête qui a été effectivement utilisé.?)

EDIT 2 : Salut, et merci de faire ce test, je l'apprécie vraiment. Je comprends la question que vous avez été obligé de poser, car je me suis énervé pendant un bon moment maintenant. Je dois dire que ça existe.

Si je fais ce qui suit, comme un exemple rapide et sale:

$name = 'introduction'; 
@mysql_connect('host', 'user', 'pass'); 
@mysql_select_db('db'); 
$query = "SELECT name,content FROM sections WHERE name = '$name'"; 
$result = mysql_query($query) or die(mysql_error()); 
while($row = mysql_fetch_object($result)) { 
    $content = $row->content; 
    echo $content; 
} 

Mes données apparaît et tout va bien. Toutefois, si je fais ce qui suit:

$name = 'introduction'; 
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.'); 
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?"); 
$stmt->bind_param('s', $name); 
$stmt->execute(); 
$stmt->bind_result($name, $content); 
$stmt->fetch(); 
echo $content; 
$stmt->close(); 

Ce que je crois est correcte (ne hésitez pas à crier sinon, bien sûr), je ne reçois rien. De plus, avec ce code, quand je fais une validation html (juste au cas où), je reçois un avertissement de serveur interne (500), que je considère être un problème avec le code sql. Suis-je juste fou?

Merci pour votre aide continue, c'est très apprécié! Eh bien, je me sens comme un idiot, mais, je l'ai corrigé, et Bill, votre question était juste sur. Je ne sais pas comment j'ai réussi à mettre des détails de base de données incorrects et à les manquer si longtemps, mais c'est précisément ce qui s'est passé.

Merci encore pour votre patience et votre volonté d'aider.

+0

Veuillez ne pas publier de réponses en tant que mises à jour à votre question - c'est pour cela que le lien Modifier est pour –

+0

@John: Merci pour cela, je viens d'être informé par un autre utilisateur, et j'ai édité ma question originale. Excuses. –

Répondre

4

Je ne vois rien de mal avec votre préparation de la déclaration ou de l'utilisation des paramètres, mais il y a quelque chose de mal dans votre résultats de liaison:

http://php.net/manual/en/mysqli-stmt.bind-result.php dit:

Notez que toutes les colonnes doivent être liées après mysqli_stmt_execute() et d'appeler mysqli_stmt_fetch().

(Souligné par l'auteur)


Le doc ci-dessus doivent être considérés comme toutes les colonnes de votre requête, et non pas toutes les colonnes de votre table.

D'accord, je viens de l'essayer moi-même. Si je laisse de côté la colonne $name, il donne cet avertissement:

PHP Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't 
match number of fields in prepared statement in mysqli.php on line 9 
PHP Stack trace: 
PHP 1. {main}() /Users/bill/workspace/PHP/mysqli.php:0 
PHP 2. mysqli_stmt->bind_result() /Users/bill/workspace/PHP/mysqli.php:9 

Mais il ne récupère les données.

Si je lie à la fois $name et $content aux résultats de la requête, cela fonctionne sans erreur ni avertissement.

Donc, je suis obligé de vous demander: êtes-vous sûr il y a une ligne dans la base de données qui correspond à votre condition? Autrement dit, où name = 'introduction'? Gardez à l'esprit que dans SQL, les comparaisons de chaînes sont sensibles à la casse par défaut. Une erreur que je vois souvent chez les gens est qu'ils se connectent à une base de données différente dans leur script PHP que la base de données qu'ils utilisent pour des requêtes ad hoc. Vous devez donc être absolument certain de vérifier que les données existent dans la bonne base de données.

0

Si pas être

$stmt->bind_result($name, $content); 

Lorsque vous sélectionnez 2 colonnes

Questions connexes