2010-12-12 74 views
0
déclaration

Je suis en train de faire une déclaration préparée à l'aide de base + pdo mysql .. Je ne peux pas sembler obtenir les valeurs attribuées à la vie de moi:/PHP PDO de base préparé

$dbh = new PDO('mysql:dbname=users;host=127.0.0.1', 'localAPI', 'localAPI'); 
$a = 'asdf'; 
$sth = $dbh->prepare("INSERT INTO users (userName, userPass, accountStatus) VALUES (':a', ':userPass', 'unconfirmed')"); 
$sth->bindParam(':a', $a, PDO::PARAM_STR); 
$sth->execute(); 

Toutes les idées ? Merci d'avance !!

Tableau des résultats:

mysql> select * from users; 
+--------+----------+-----------+---------------+-------------+---------+---------------------+----------+------------+---------+------+ 
| userId | userName | userPass | accountStatus | accountType | balance | tCreated   | tUpdated | tLastLogin | promoId | ref | 
+--------+----------+-----------+---------------+-------------+---------+---------------------+----------+------------+---------+------+ 
|  1 | :a  | :userPass | unconfirmed | user  |  0 | 2010-12-12 13:42:10 |  NULL |  NULL | NULL | NULL | 
+--------+----------+-----------+---------------+-------------+---------+---------------------+----------+------------+---------+------+ 
+0

Pourquoi en avez-vous besoin? –

+0

@Col Je pense que le PO a simplifié la question. Les chances sont, les valeurs ne sont pas des constantes connues. – Phil

Répondre

2

Vous entourez vos variables dans l'instruction SQL avec des guillemets ... ':a' ... Retirez-les, car l'analyseur penserait que vous vouliez dire une chaîne ici, pas une variable. Vous indiquez à la base de données que vous voulez dire une chaîne avec l'appel bind().

+0

Oui, je l'ai attrapé juste comme vous avez répondu .. merci !!/moi craque ouvrir un taureau rouge: P –

0

Le var_dump ne devrait pas vous montrer une requête avec :test substitué par 123, qui semble être ce que vous attendez. Appelez $sth->execute(); et vous avez terminé.

La raison est liée au fonctionnement des instructions préparées. Voir, lorsqu'une requête est exécutée, ce qui se passe est que la requête est envoyée en tant que chaîne à la base de données. Ici, il est analysé dans une forme interne, qui est ensuite exécutée dans un interpréteur. Avec une instruction préparée, les valeurs des variables (telles que 123 pour :test) sont transmises et analysées séparément de la requête. Cela signifie que vous ne pouvez pas "tromper" l'analyseur - ce sur quoi les attaques par type d'injection reposent - simplement parce que les valeurs ne font jamais partie de la requête et n'atteignent donc jamais l'analyseur.

+0

Merci pour la réponse .. –

+0

Merci pour l'explication mais le problème est que les données ne sont pas à la base de données car il montre les paramètres sans être remplacé. Je l'ai testé sur deux serveurs et je ne sais pas ce qui pourrait être le coupable à ce stade .. toutes les idées seraient grandement appréciées :) –