Question

S'il vous plaît, pardonnez-moi de la possibilité que cette question soit stupide, mais je viens de commencer à utiliser des déclarations préparées. Je sais que cette requête fonctionne, car je l’ai testée avec des méthodes procédurales non préparées. La voici:

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

Tous les conseils ou points allant dans la bonne direction sont grandement appréciés!

EDIT 1: Juste une mise à jour sur mes progrès alors que je tente de résoudre les problèmes. Je me suis rendu compte que, puisque j'ai une colonne id sous forme d'index dans le tableau des sections, je devais également la lier, compte tenu de 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 difficile de déboguer lorsque j'utilise le style OOP d'énoncés préparés de cette manière. Existe-t-il, par exemple, un moyen simple de voir simplement la requête réellement utilisée?)

EDIT 2: Bonjour et merci d'avoir fait ce test, je l'apprécie vraiment. Je comprends la question que vous avez été obligée de poser, car cela fait aussi très mal que je réfléchis à cela. Je dois dire que ça existe.

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

$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 apparaissent et tout va bien. Si, toutefois, 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 qui, à mon avis, est correct (n'hésitez pas à crier sinon, bien sûr), je ne reçois rien. De plus, avec ce code, lorsque je fais une validation html (juste au cas où), je reçois un avertissement de serveur interne (500), que je considère comme un problème avec le code SQL. Suis-je juste fou?

Merci de votre aide continue, c'est très apprécié!

EDIT 3: Eh bien, je me sens idiot, mais je l’ai corrigé et Bill, votre question était juste. Je ne sais pas comment j'ai réussi à insérer des informations incorrectes dans la base de données et à les rater si longtemps, mais c'est précisément ce qui s'est passé.

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

Était-ce utile?

La solution

Je ne vois rien d’erreur dans la préparation de votre déclaration ou de l’utilisation de paramètres, mais dans vos résultats de liaison, il y a un problème:

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 avant   appeler mysqli_stmt_fetch () .

(c'est moi qui souligne)

Le document ci-dessus doit être considéré comme toutes les colonnes de votre requête, pas toutes les colonnes de votre table.

D'accord, j'ai juste essayé moi-même. Si j'omets la colonne $ name , l'avertissement suivant apparaît:

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 cela récupère les données.

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

Je suis donc obligé de vous demander: êtes-vous sûr qu'il y a une ligne dans la base de données qui correspond à votre condition? C’est-à-dire où name = 'introduction' ? N'oubliez pas qu'en SQL, les comparaisons de chaînes sont sensibles à la casse par défaut.

Une erreur que je vois fréquemment chez les gens est qu'ils se connectent à une base de données différente dans leur script PHP par rapport à la base de données qu'ils utilisent pour les requêtes ad hoc. Vous devez donc être absolument sûr de vérifier que les données existent dans la bonne base de données.

Autres conseils

Cela ne devrait-il pas être

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

Lorsque vous sélectionnez 2 colonnes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top