2016-10-05 2 views
1

J'essaie de passer un tableau en tant que paramètres d'une fonction, et j'ai quelques problèmes. Voici la fonction.

$stmt->bind_param(); 

Je faisais des recherches et constaté que vous pouvez utiliser ceci:

$stmt->bind_param(...$values); 

Cela a bien fonctionné sur mon serveur de développement (PHP 7.0.0), mais quand j'entré dans un autre serveur (PHP 5. *), je suis l'erreur suivante:

erreur de syntaxe, inattendue, expecting ')'

Sur d'autres recherches, je TRIE. ' d:

call_user_func_array(array($stmt, 'bind_param'), $values); 

et a obtenu cette erreur:

call_user_func_array() attend le paramètre 1 pour être un rappel valide, premier membre du groupe n'est pas un nom de classe valide ou un objet

* En note latérale, je sais que je pourrais juste entrer les paramètres et tout ira bien, mais j'ai besoin de la fonction pour prendre un certain nombre de paramètres (qui est ce qui a conduit à l'idée de la fonction).

est ici la fonction:

function updateId($id, $data){ 

    $mysqli = dbConnect::connect(); 

    $sm=array(); 
    $values=array(); 
    $dataString = array(); 

    foreach($data as $column=>$value){ 
     $dataString[] = ($column .'= ?'); 
     $values[] = $value; 
     if(gettype($value)==="string"){ 
      $sm[] = 's'; 
     }elseif(gettype($value)==="integer"){ 
      $sm[] = 'i'; 
     }elseif(gettype($value)==="double"){ 
      $sm[] = 'd'; 
     }else{ 
      $sm[] = 'b'; 
     } 
    } 

    $dataString = implode(', ',$dataString); 
    $sm = implode('',$sm); 

    $prepString = "UPDATE $this->tablename SET $dataString WHERE id=$id"; 

    array_unshift($values, $sm); 

    $stmt = $mysqli->prepare($prepString); 
    $stmt->bind_param(...$values); 
    $stmt->execute() or die($stmt->error); 
    $stmt->close(); 
    $mysqli->close(); 

} 
+0

Peut-être que si vous nous avez montré du code, vous obtiendrez une meilleure réponse. – RiggsFolly

+0

Semble auto-explicatif _le membre du premier tableau n'est pas un nom de classe ou un objet valide – AbraCadaver

+0

Je peux fournir cela si cela est utile, mais cela fonctionne dans mon serveur de développement. Toutes les erreurs pointent vers cette ligne. – Blaise

Répondre

1

vous obtenez une erreur parce que vous passez des valeurs non référence à bind_param. Vous pouvez utiliser call_user_func_array, mais vous devez vous assurer que les valeurs que vous transmettez sont des références. Vous pouvez réaliser comme suit:

Modifier ceci:

$values[] = $value; 

à ceci:

$values[] = &$data[$column]; 

Et (comme vous avez déjà fait) changer ceci:

$stmt->bind_param(...$values); 

dans ce :

call_user_func_array(array($stmt, 'bind_param'), $values); 
+0

Merci beaucoup. Quelle est la différence entre $ values ​​[] = $ value; et $ values ​​[] = & $ data [$ colonne] ;? – Blaise

+1

La différence est visible lorsque vous var_dump le tableau après la boucle: avec le code modifié, vous voyez un '&' avant chaque valeur, ce qui signifie qu'il s'agit de pointeurs (ou d'adresses) se référant à la valeur réelle. C'est ce dont 'bind_param' a besoin. Je suppose qu'il a besoin de ceci pour permettre de traiter les paramètres de sortie, ce qui n'est pas votre cas, mais cela pourrait être le cas lors de l'appel de procédures/fonctions stockées. – trincot

+0

Cool. Merci beaucoup! – Blaise