J'essaie d'écrire des instructions préparées pour la saisie de l'utilisateur. Le nombre de paramètres change en fonction de la saisie de l'utilisateur. Oam essaie ce code
Code PHP :
$string = "my name"; $search_exploded = explode( " ", $string ); $num = count( $search_exploded ); $cart = array(); for ( $i = 1; $i <= $num; $i ++ ) { $cart[] = 's'; } $str = implode( '', $cart ); $inputArray[] = &$str; $j = count( $search_exploded ); for ( $i = 0; $i < $j; $i ++ ) { $inputArray[] = &$search_exploded[ $i ]; } print_r( $inputArray ); foreach ( $search_exploded as $search_each ) { $x ++; if ( $x == 1 ) { $construct .= "name LIKE %?%"; } else { $construct .= " or name LIKE %?%"; } } $query = "SELECT * FROM info WHERE $construct"; $stmt = mysqli_prepare( $conn, $query ); call_user_func_array( array( $stmt, 'bind_param' ), $inputArray ); if ( mysqli_stmt_execute( $stmt ) ) { $result = mysqli_stmt_get_result( $stmt ); if ( mysqli_num_rows( $result ) > 0 ) { echo $foundnum = mysqli_num_rows( $result ); while( $row = mysqli_fetch_array( $result, MYSQLI_ASSOC ) ) { echo $id = $row['id']; echo $name = $row['name']; } } }
Quand je print_r($inputArray)
le résultat est :
Array ( [0] => ss [1] => my [2] => name )
Aucune erreur n'est affichée dans le journal des erreurs.
Qu'est-ce qui n'a pas fonctionné ?
Écrivez un gestionnaire de requêtes générique et transmettez-lui votre requête, votre tableau de paramètres et votre liste de types de paramètres. Renvoie un ensemble de résultats ou de messages. Il s'agit de ma version personnelle de mysqli (j'utilise principalement PDO, mais j'ai configuré des fonctionnalités similaires pour cela). Faites de même pour les insertions, les mises à jour et les suppressions. Ensuite, conservez simplement votre bibliothèque et utilisez-la pour tout ce que vous faites :) Notez que si vous commencez par cela, vous souhaiterez peut-être mieux gérer les erreurs de connexion, etc.
%
Paramètres surround, pas d'espaces réservés.Mon extrait de code utilisera la syntaxe mysqli orientée objet, plutôt que la syntaxe procédurale démontrée par votre code.
Vous devez d'abord préparer les ingrédients nécessaires :
Je vais combiner #2 et #3 dans une variable pour un "déballage" plus facile à l'aide de l'opérateur splat (
...
). La chaîne de type de données doit être le premier élément, puis un ou plusieurs éléments représenteront la valeur liée.En tant qu'inclusion logique, s'il n'y a pas de condition dans la clause WHERE, il n'y a aucun avantage à utiliser une instruction préparée ; il suffit d'interroger directement la table.
Code : (Démo PHPize.online)
Pour tous ceux qui recherchent des techniques de requêtes dynamiques similaires :
SELECT
,IN()
contient un nombre dynamique de valeursINSERT
一次execute()
Nombre dynamique de lignes appelées