Lorsque vous utilisez PHP pour effectuer des requêtes SQL, vous rencontrerez certains problèmes si l'instruction de requête contient du chinois. Cet article décrit ces problèmes et comment les résoudre.
Problème 1 : L'instruction de requête SQL contient du chinois et ne peut pas être exécutée normalement ou les résultats de la requête sont incorrects
Ce problème est généralement dû à des problèmes d'encodage. Lorsque vous utilisez des chaînes chinoises comme conditions de requête, vous devez vous assurer que l'instruction de requête et le codage de la base de données sont cohérents, sinon des caractères tronqués apparaîtront ou les résultats de la requête seront incorrects.
Solution :
$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $db->exec('SET NAMES utf8'); $name = '张三'; $stmt = $db->prepare('SELECT * FROM table WHERE name = ?'); $stmt->execute(array($name)); $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
Dans l'exemple ci-dessus, "SET NAMES utf8" indique à la base de données d'analyser les entrées et les sorties à l'aide du codage UTF-8. Utilisez ensuite les instructions préparées par PDO pour vous assurer que les paramètres de requête sont correctement codés.
Problème 2 : attaque par injection SQL
Étant donné que l'instruction de requête SQL contient des données saisies par l'utilisateur, vous pouvez être confronté à des attaques par injection SQL. Lorsque l'utilisateur saisit une chaîne malveillante, l'attaquant peut injecter du code SQL arbitraire dans la requête, comme supprimer des tables, insérer des données malveillantes, etc.
Solution :
$name = $_POST['name']; $stmt = $db->prepare('SELECT * FROM table WHERE name = ?'); $stmt->execute(array($name)); $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
Dans cet exemple, le "nom" saisi par l'utilisateur est obtenu à partir du tableau $_POST, puis transmis en tant que paramètre à l'espace réservé "?" dans l'instruction préparée par le PDO.
$name = filter_var($_POST['name'], FILTER_SANITIZE_STRING); $stmt = $db->prepare('SELECT * FROM table WHERE name = ?'); $stmt->execute(array($name)); $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
Dans l'exemple ci-dessus, utilisez le filtre FILTER_SANITIZE_STRING pour vous assurer que $name ne contient que des caractères de chaîne et supprimez toutes les balises HTML et les caractères inutiles.
Utilisez ces méthodes pour résoudre le problème des caractères chinois inclus dans les instructions de requête SQL dans les requêtes PHP. Assurez-vous que le codage des instructions de requête et des données d'entrée utilisateur est cohérent et utilisez des instructions ou des filtres de prétraitement PDO pour garantir la sécurité des données d'entrée utilisateur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!