2010-12-07 84 views
1

J'ai une instruction préparée par PDO dans laquelle les variables liées sont préparées dynamiquement (elles peuvent varier d'appel en appel) dans une fonction de recherche avancée sur notre site.PDO lance de manière inattendue des erreurs de variable liée avec plusieurs paramètres liés

Je sais l'appel SQL réel est correct, mais pour une raison quelconque, je me fais l'erreur suivante en essayant de passer ma variable de chaîne dans la déclaration préparée:

SQLSTATE [HY093]: Paramètre non valide Numéro: nombre de variables liées ne correspond pas à nombre de jetons

J'ai eu cette erreur avant et je connais très bien les étapes normales de résolution. Cependant, mes circonstances sont assez étranges. Avec le code exemple suivant:

$columns = "FirstName, LastName, ID, City, State"; 
$sWhere = "WHERE (FirstName LIKE ? AND LastName 
    LIKE ? AND ID LIKE ? AND City 
    LIKE ? AND State LIKE ?)"; 
$sVal = "'tom', 'lastname', '12345', 'Diego', 'CA'"; 

$sql = "SELECT ".$columns." FROM table ".$sWhere; 
$stmt = $db->prepare($sql); 

$stmt->execute(array($sVal)); 

$sVal peut aller de 'prenom', 'nom' .... à plus de 12 variables. Changer le nombre de variables a le même résultat. La déclaration complète est:

SELECT FirstName, LastName, ID, City, State 
    FROM table 
    WHERE (FirstName LIKE ? AND LastName 
    LIKE ? AND ID LIKE ? AND City 
    LIKE ? AND State LIKE ?) 

Quand je lance ma requête en l'état, l'erreur ci-dessus est renvoyée. Quand j'ai pensé que j'avais en fait un nombre incorrect de variables, j'ai couru un ECHO sur ma déclaration de valeur de $ et j'ai constaté qu'ils correspondaient.

En tant que deuxième test, je pris la sortie de l'écho de la valeur $ et branché directement dans le tableau exécuter:

$stmt->execute(array('tom', 'lastname', '12345', 'Diego', 'CA')); 

Cela fonctionne avec toute question du tout.

Il ne touche pas à ma question mais j'ai aussi placé des symboles% au sein de ma variable $ Sval pour l'exactitude:

$ Sval = " '% tom%', '% LastName%', '% 12345%', '% Diego%', '% CA%' ";

Cela fait ZERO sens pour moi que la sortie écho de la variable SAME fonctionnerait mais la variable elle-même ne le ferait pas. Des idées?

+1

En l'état actuel, il n'y a pas suffisamment d'informations pour répondre à votre question. Pouvez-vous fournir la requête et le contenu de '$ value'? – netcoder

+0

pouvons-nous voir plus de code? – Galen

Répondre

3

Votre $sVal est pas un tableau, il est juste une simple chaîne, alors quand vous écrivez array($sVal), le execute() ne voit qu'une seule valeur. Vous devez explode() votre chaîne $sVal pour devenir un tableau:

// clean up the unnecessary single quotes and spaces 
$value = str_replace(array("'", ", "), array("", ","), $value); 
// make the array of the values 
$value = explode(',', $value); 
$stmt->execute($value); 
+0

@ JM4 Non, vous avez besoin que le tableau soit le bon nombre d'éléments, pas seulement un élément de chaîne concaténé. –

+0

styu - dites-moi quelle est la différence dans ces deux déclarations: $ foo-> execute (array ('1', '2', '3', '4')); et $ foo-> execute ($ bar); où $ bar = array ('1', '2', '3', '4'); – JM4

+2

Votre '$ bar' n'est pas un tableau (si c'est le cas, vous ne pouvez pas l'echo (parce que echo ne sort que' Array' que du texte quand vous l'essayez avec un tableau), c'est une chaine, donc ca veut dire '$ foo-> execute (array (" '1', '2', '3', '4' "));' en tant que chaîne, et ce que nous essayons de vous dire avec [netcoder] (http: //stackoverflow.com/questions/4380976/pdo-throws-bound-variable-errors-when-it-shouldnt/4381024#4381024) est '$ foo-> execute (array ('1', '2', '3 ',' 4 ')); 'avec des éléments du tableau –

1

Le problème est que execute accepte un tableau de paramètres, avec chaque paramètre ayant sa propre clé. Passer une chaîne de type SQL, séparée par des virgules, ne fonctionnera pas, et même si c'était le cas, cela rendrait le PDO inutile.

Ceci est faux:

$sVal = "'tom', 'lastname', '12345', 'Diego', 'CA'"; 

Voici comment il est censé faire:

$sVal = array('tom', 'lastname', '12345', 'Diego', 'CA'); 

Par exemple, si vous recevez des données d'un formulaire POST, il serait:

$sVal = array(
    $_POST['firstname'], 
    $_POST['lastname'], 
    $_POST['zipcode'], 
    $_POST['city'], 
    $_POST['state'], 
); 
$stmt->execute($sVal); 
+0

ce n'est pas vraiment un tableau, je vais corriger dans une édition, c'est une déclaration créée avec des virgules et des apostrophes si nécessaire – JM4

+0

une valeur echo $ afficherait également un tableau s'il s'agissait d'un tableau. C'est une chaîne – JM4

+0

Voir ma réponse mise à jour. – netcoder