4 votes

Liaison dynamique du tableau de paramètres MySQLi

Je suis en train de créer une fonction de recherche pour mon site Web où l'utilisateur peut effectuer une recherche en utilisant 3 paramètres. L'utilisateur peut choisir d'entrer les 3 paramètres pour filtrer le tableau ou aucun et recevoir le tableau entier. J'ai trouvé comment construire dynamiquement la requête en fonction de ce que l'utilisateur saisit, mais j'ai des difficultés à appeler les paramètres suivants bind_params() avec le bon nombre d'arguments et le bon ordre.

Code :

$sql = "SELECT position, rank, fullname, phonenumber, email, division 
FROM `table` WHERE 1=1 ";

if(!empty($_POST['fname'])){
   $firstname = $_POST['fname'];
   $sql .= " AND `fullname` LIKE '%?%'";
}

if($_POST['div'] !== "All"){
   $division = $_POST['div'];
   $sql .= " AND `division` LIKE '%?%'";
}

if(!empty($_POST['pos'])){
   $position = $_POST['pos'];
   $sql .= " AND `position` LIKE '%?%'";
}

$stmnt = $db->prepare($sql);
$stmnt -> bind_param('sss', $firstname, $division, $position); 
$stmnt -> bind_result($position, $rank, $fullname, $phonenumber, $email,$division);
$stmnt -> execute();

Je reçois toujours cette erreur : Number of variables doesn't match number of parameters in prepared statement Je comprends pourquoi je l'ai mais j'ai essayé plusieurs choses mais rien n'a marché. Tout conseil ou lien vers une documentation serait utile. Merci

2voto

rhazen Points 154

Vous pouvez transmettre vos données et paramètres sous forme de tableau :

$data = array();
$format = array();

if(!empty($_POST['fname'])){
    $firstname = $_POST['fname'];
    $sql .= " AND `fullname` LIKE '%?%'";
    $format[] = 's';
    $data[] = $firstname;
}

Puis les passer par référence et les lier avec call_user_func_array

if(!empty($format) && !empty($data)):

            $format = implode( '', $format );
            $format = str_replace( '%', '', $format );

            array_unshift( $data, $format );
            call_user_func_array( array( $stmnt , 'bind_param' ), (referenceValues( $data ) );

        endif;

La fonction de passage par référence :

public function referenceValues($array)
    {
        $refs = array();

        foreach ($array as $key => $value):

            $refs[$key] = &$array[$key];

        endforeach;

        return $refs; 
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X