preg_replace

blaisoth2
Invité n'ayant pas de compte PHPfrance

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 !!

Mammouth du PHP | 2703 Messages

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.

Petit nouveau ! | 5 Messages

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>";

Mammouth du PHP | 2703 Messages

23 janv. 2022, 21:16

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

Petit nouveau ! | 5 Messages

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)

Petit nouveau ! | 5 Messages

23 janv. 2022, 21:25

Est-ce une question d'encodage ?

Mammouth du PHP | 2703 Messages

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.

Petit nouveau ! | 5 Messages

23 janv. 2022, 21:40

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

Mammouth du PHP | 2703 Messages

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.

Petit nouveau ! | 5 Messages

23 janv. 2022, 21:47

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

Mammouth du PHP | 2703 Messages

23 janv. 2022, 22:06


blaisoth2
Invité n'ayant pas de compte PHPfrance

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 !