2013-07-26 1 views
6

En ce moment je suis d'avoir à utiliser la structure suivante pour faire face à la liaison de plusieurs paramètres dans une requête mysqli:paramètres Bind multiples dans la requête mysqli

if ($words_total == 1) 
{ 
    $statement -> bind_param("s", $words[0]); 
} 
else if ($words_total == 2) 
{ 
    $statement -> bind_param("ss", $words[0], $words[1]); 
} 
else if ($words_total == 3) 
{ 
    $statement -> bind_param("sss", $words[0], $words[1], $words[2]); 
} 

//and so on.... 

Je travaille sur le nombre de points d'interrogation à l'aide du code ci-dessous et l'insérer dans ma requête:

$marks = ""; 
for($i = 1; $i<=$words_total; $i++) { 
    if ($i == $words_total) 
    { 
     $marks .= "?"; 
    } 
    else 
    { 
     $marks .= "?,"; 
    } 
} 

ma question est sûrement il doit y avoir une façon de traiter autant d'entrées dans la requête que j'ai besoin dynamiquement. Coder en dur le bind_param() semble être une très mauvaise façon de gérer cela.

J'utilise la version php 5.4.10

Répondre

14

Goès Voici la solution ou le problème réel de lier un certain nombre de valeurs variables à Mysqli déclaration préparée:

<?php 
$values = array('b','c','d'); 

$in = str_repeat("?,", count($values)); 
$in = trim($in, ","); 

$sql = "SELECT * from users where username in($in)"; 
$stm = $con->prepare($sql); 

$types = str_repeat("s", count($values)); 

if (strnatcmp(phpversion(),'5.3') >= 0) 
{ 
    $bind = array(); 
    foreach($values as $key => $val) 
    { 
     $bind[$key] = &$values[$key]; 
    } 

} else { 

    $bind = $values; 
} 

array_unshift($bind, $types); 
call_user_func_array(array($stm, 'bind_param'), $bind); 

#var_dump($sql, $types, $bind, $con->error); 

$stm->execute(); 
$res = $stm->get_result(); 
while($row = $res->fetch_assoc()) var_dump($row); 

ligne commentée est pour les tests de développement ne . Extrêmement utile.

Mais votre problème initial était l'absence de rapports d'erreurs.

Il vous a gâté non seulement dans ce cas particulier, mais toute votre expérience avec PHP.
Chaque fois que quelque chose ne va pas, PHP vous dira - ce qui s'est passé et à qui blâmer. Seulement si vous le permettez. Et vous devriez toujours.

Vous pouvez lire ce answer on error reporting basics

Tout en ayant un message d'erreur, vous pouvez simplement google pour elle et trouver une solution en quelques secondes. Ou au moins vous saurez, quel problème vous avez. Ce qui est en fait le comportement de call_user_func_array() fonction, qui a été soudainement changé.

+0

Merci beaucoup pour cela - j'étais littéralement au désespoir de ma solution laide à ce problème. Je suis d'accord que le signalement d'erreurs est une de mes faiblesses que je dois passer le temps d'en apprendre davantage. J'ai seulement appris le php il y a 2 mois, donc jusqu'à présent, tout a été fait pour pouvoir en faire autant que possible. Maintenant, je pense que je devrais peut-être me concentrer davantage sur faire les choses aussi bien que possible !! Câlins et merci! –

Questions connexes