2009-12-22 5 views
1

Je suis nouveau sur PHP et PDO, et j'essaie d'utiliser des instructions préparées ici. Après une heure d'essai, j'abandonne. Ou mon tutoriel était horriblement mauvais.Comment utiliser les instructions préparées dans cette requête?

EDIT:

Cela fonctionne parfaitement sans instructions préparées:

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); 
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name="root"'); 
    //$prepared->bindParam('foo', 'root'); 

    $prepared->execute(); 

    foreach($prepared as $row) { 
     print_r($row); 
    } 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

Mais cela ne fonctionne pas du tout avec une déclaration préparée. Obtention d'une page totalement vide en procédant ainsi:

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); 
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name=:foo'); 
    $prepared->bindParam('foo', 'root'); 

    $prepared->execute(); 

    foreach($prepared as $row) { 
     print_r($row); 
    } 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

foo doit être remplacé par root. Cependant, ce n'est pas le cas.

+0

Vous semblez avoir accepté une réponse incorrecte, et ignoré la vraie réponse (il vous manque a: dans le bindParam '$ prepare-> bindParam (': foo', 'root') ') – rjmunro

Répondre

1

Vous ne pouvez pas utiliser params pour des trucs comme les noms de table et de colonne, il est destiné à être utilisé pour les données, et non pour les requêtes entièrement dynamiques

Cela devrait fonctionner:

$prepared = $dbh->prepare('SELECT * from sy_navigation_point WHERE Foo=:whatever'); 
$prepared->bindParam('whatever', 'Bar'); 

EDIT: Cela devrait être la vraie solution.

En regardant la documentation, il est clair que le modèle doit être:

$prepared = $dbh->prepare('SELECT * from sy_navigation_point WHERE Foo=:whatever'); 
$prepared->bindParam('whatever', $value); 

Ensuite, vous faites:

$value = 'Bar'; 
$prepared->execute(); 
+0

ne fonctionne pas: Je reçois une page vierge dès que je fais une liaison param – openfrog

+0

J'ai mis à jour ma question avec de meilleurs exemples. Ça ne marche pas. – openfrog

+0

Ne fonctionne pas, mais la réponse est acceptée? Quelle était la solution? –

1

http://www.php.net/manual/en/pdo.prepare.php Un commentateur il dit que cela ne fonctionne pas correctement pour les mots-clés, noms de table, affichage des noms et des noms de champs Vous auriez besoin $prepared = $dbh->prepare('SELECT * from ' . $table);

Comme il ne fonctionne vraiment pour les variables de colonne.

+0

J'ai mis à jour ma question avec de meilleurs exemples. Cela ne fonctionne pas même pour les variables de colonne. – openfrog

0

Vous ne pouvez pas lier une table dans une déclaration MySQL préparée, vous pouvez ne lier que des valeurs. De the manual:

Cependant, ils ne sont pas autorisés pour les identifiants (noms de table ou de colonne), ou pour spécifier les deux opérandes d'un opérateur binaire comme le signe = égal.

2

seconde de votre bindParam paramètre a être une variable, sinon vous obtiendrez une erreur fatale.Ainsi,

$value='root'; 
$prepared->bindParam('foo', $value); 

ou:

$prepared->bindValue('foo', 'root'); 


Il est facile de savoir quand les messages d'erreur sont affichés:

if ($in_development) ERROR_REPORTING(E_ALL); 
// ... code 
5

Essayez d'utiliser le côlon au nom aussi lors de la liaison:

$prepared->bindParam(':foo', 'root'); 

Comme je t est fait dans les docs: http://php.net/manual/en/pdostatement.bindparam.php

+0

Je suis sûr que c'est la bonne réponse, et devrait être acceptée. Les autres réponses ont confondu PDO avec MySQLi. – rjmunro

Questions connexes