Maison > Questions et réponses > le corps du texte
P粉6198961452023-09-03 10:06:17
Tout d'abord, envisagez d'utiliser des paramètres nommés au lieu de <代码> ? 代码>. Dans ce cas, vous n'avez rien à remplacer : les paramètres nommés sont clairs et assez faciles à afficher dans les journaux, et sont pris en charge par la plupart des clients dbms à des fins de débogage.
Si les paramètres nommés ne sont pas réalisables (en raison d'une base de code actuelle volumineuse ou pour toute autre raison), vous avez deux approches principales :
Si vous choisissez cette dernière méthode, voici un exemple de la façon de le faire rapidement et salement :
Remplacez en plusieurs étapes :
?
替换为其他极不可能出现在参数或查询中的内容来准备参数。例如?
. ?
,但不会匹配第一步中的替换。如果用 ?
替换,则为 (?
?
替换为 ?
dans les résultats. Remarque : Les résultats de ce remplacement ne doivent jamais être utilisés comme requêtes dans les programmes. Ce remplacement a le potentiel de mettre en œuvre tout ou partie des éléments suivants :
?
à la place comme paramètre (par exemple dans un commentaire), les résultats sont inexacts, ?
), les résultats ne seront pas précis. <?php $query = 'UPDATE `list` set `item`=?,`type`=? WHERE (`id` = ?);'; $params = array( 'item' => '1', 'type' => 'Are you o\'k?', 'id' => 2 ); function substitute_params($query, $params) { $prep_params = str_replace(array("'","?"),array("''","\?"),$params); $query = array_reduce($prep_params, function ($interm, $param) { return preg_replace('/(?<!\\)\?/m', is_numeric($param) ? $param : '\'' . $param . '\'', $interm, 1); }, $query); return "-- Not to be used as a query to database. For demonstration purposes only!\n" .str_replace("\?", "?", $query); } echo substitute_params($query, $params); ?>
Sortie :
-- Not to be used as a query to database. For demonstration purposes only! UPDATE `list` set `item`=1,`type`='Are you o''k?' WHERE (`id` = 2);
Edit : Pour essayer de réduire l'impact des points d'interrogation à l'intérieur des chaînes constantes et des noms entre guillemets, vous pouvez essayer d'utiliser ce remplacement :
return preg_replace('/^([^"\'`]*?(?:(?:`[^`]*?`[^"\'`]*?)*?(?:"[^"]*?"[^"\'`]*?)*?(?:\'[^\']*?\'[^\'"`]*?)*?)*?)(?<!\\)\?/m', ''.(is_numeric($param) ? $param : '\'' . $param . '\''), $interm, 1);
Il remplace uniquement "`'
引用的块之外的 ?
en dehors du bloc cité par "`'
.
Vous pouvez voir la démo ici.
Veuillez garder à l'esprit qu'il ne s'agit pas d'un analyseur à part entière. Par exemple, il ne connaît pas les commentaires. La possibilité d’une substitution incorrecte reste donc élevée.