preg_replace

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : preg_replace

Re: preg_replace

par blaisoth2 » 24 janv. 2022, 12:56

Super, ça m'a permis de voir les caractères en trop : des tabulations (code 9) et des line-feed (code 13).
La question devient donc :
- comment traiter la chaîne pour les remplacer par des espaces (simplement je veux dire, sans reconstruire avec chr)
ou alors
- comment écrire ma regex pour tenir compte de ces codes (.* ne les concerne pas apparemment)

Merci pour ton aide précieuse Mammouth !

Re: preg_replace

par or 1 » 23 janv. 2022, 22:06

Re: preg_replace

par blaisoth » 23 janv. 2022, 21:47

Existe-t-il une fonction qui donne le vrai contenu de la chaîne ?

Re: preg_replace

par or 1 » 23 janv. 2022, 21:43

il n'indique pas un nombre erroné. la chaine à l'affichage peut sembler la même mais être en réalité différente.

Re: preg_replace

par blaisoth » 23 janv. 2022, 21:40

OK, merci Mammouth.
Comment var_dump peut-il indiquer un nombre de caractères erroné ?

Re: preg_replace

par or 1 » 23 janv. 2022, 21:36

$sql = "SELECT id FROM enfant WHERE true AND id = 100000226 AND c_i_id = 1 AND ou_ad = 'false' AND ouoint = 'false' AND benon = 'true'";
var_dump ($sql);
$sqlsplit = preg_split('/AND/', $sql);
$a = trim($sqlsplit[0]);
$sql_recomp = preg_replace ("/SELECT.*FROM/", "SELECT * FROM", $a); //élaboration de la requête
var_dump ($a);
echo "</br>\n";
var_dump($sql_recomp);

résultat :
string(126) "SELECT id FROM enfant WHERE true AND id = 100000226 AND c_i_id = 1 AND ou_ad = 'false' AND ouoint = 'false' AND benon = 'true'"
string(32) "SELECT id FROM enfant WHERE true" </br>
string(31) "SELECT * FROM enfant WHERE true"

le code fonctionne quand $sql a une longeur qui correspond au nombre de caractères de la chaine.
pourquoi ce n'est pas le cas ? impossible à dire sans le code qui génère le contenu de $sql.

Re: preg_replace

par blaisoth » 23 janv. 2022, 21:25

Est-ce une question d'encodage ?

Re: preg_replace

par blaisoth » 23 janv. 2022, 21:24

string(164) " SELECT id FROM enfant WHERE true AND id = 100000226 AND c_i_id = 1 AND ou_ad = 'false' AND ouoint = 'false' AND benon = 'true' "
(j'ai un peu modifié les champs. J'avais une chaîne string(222) alors que je comptais 186 caractères)

Re: preg_replace

par or 1 » 23 janv. 2022, 21:16

on peut avoir la valeur de $sql passée à la fonction ?

Re: preg_replace

par blaisoth » 23 janv. 2022, 21:07

Le problème vient de la chaîne. (Après, qu'est-ce qui gêne preg_replace ?). Pourquoi prend-t-elle 8 caractères. J'ai essayé de créer la chaîne avec des quotes simples, ça ne change rien. Le code est tout con :
la fonction appelante crée une chaîne puis l'envoie avec trace($link_revn, $param2, $mon_sql, $param3, $param4);
la fonction trace :
function trace($link, $test, $sql, &$trace, &$pass)
{
if ($test)
{
$trace .= '<strong><span style="color:green">ok</span></strong></br>';
}
else
{
$trace .= '<span style="color:red"><strong>ko</strong></span></br></br>';
$sqlsplit = preg_split('/AND/', $sql);
$nb_arg = count($sqlsplit)-1;
$unseulchamp = false;

for ($i = 1; $i <= $nb_arg; $i++)
{
$a = trim($sqlsplit[0]);
$sql_recomp = preg_replace ("/SELECT.*FROM/", "SELECT * FROM", $a); //élaboration de la requête
var_dump ($a);
echo "</br>";
var_dump($sql_recomp);
echo "</br></br>";

Re: preg_replace

par or 1 » 23 janv. 2022, 20:47

ça donne bien un indice.
après, sans avoir le code de la fonction, le code qui génère ce qui est passé en paramètre à la fonction, impossible de comprendre ce qui se passe.

preg_replace

par blaisoth2 » 23 janv. 2022, 20:19

Bonjour,
je fais face à un mystère depuis une bonne heure ...
ce code
$sql_recomp = preg_replace ("/SELECT.*FROM/", "SELECT * FROM", $a); //élaboration de la requête
var_dump ($a);
var_dump($sql_recomp);
transforme bien
string(33) "SELECT id FROM enfant WHERE true "
en
string(32) "SELECT * FROM enfant WHERE true "
quand il est dans index.php
quand il est dans une fonction appelée par une fonction appelée ... (etc etc)
ça ne remplace rien :
string(40) "SELECT id FROM enfant WHERE true"
string(40) "SELECT id FROM enfant WHERE true"

Je viens de voir que ces deux chaînes identiques n'ont pas la même taille !?
Dans la fonction j'effectue un trim.

Est-ce que l'erreur plus loin donne un indice (les ????? avant le SELECT) :
Fatal error: Uncaught exception 'ErrorException' with message 'Undefined index: c_indic' in /data/2d_rec/fonctions.php:554 Stack trace: #0 /data/2d_rec/fonctions.php(554): exception_error_handler(8, 'Undefined index...', '/data/2d_rec/fo...', 554, Array) #1 /data/2d_rec/fonctions_v_a_r.php(677): trace(Object(PDO), false, '?????SELECT id?...', 'AD dans demp...', true) #2 /data/2d_rec/fonctions_v_a_r.php(474): enfant_conjoint(1, Array, Array, 'false') #3 /data/2d_rec/affichage.php(390): verif_rev('EQ81') #4 /data/2d_rec/transfert.php(218): include('/data/2d_rec/af...') #5 {main} thrown in /data/2d_rec/fonctions.php on line 554

Merci d'avance !!