Passer les guillemets dans un SELECT Potgresql #%@* WTF !!

Passer les guillemets dans un SELECT Potgresql #%@* WTF !! - SQL/NoSQL - Programmation

Marsh Posté le 01-04-2020 à 14:23:05    

Bonjour me revoila.
Donc, je recherche du texte contenant une apostrophe.  
J'ai pris le terme "l'histoire" sachant qu'il est présent dans la BDD

Code :
  1. //marche pas $REQDB2= str_replace("'","'",$REQ);
  2. //marche pas $REQDB2= str_replace("'","\'",$REQ);
  3. $REQDB2= str_replace("'","''",$REQ);
  4. //$REQDB2= str_replace("'","'",$REQ);
  5. //$REQDB2= str_replace("'","'",$REQ);
  6. //$REQDB2= str_replace("'","'",$REQ);
Code :
  1. $REQ="l'histoire";
  2. $REQDB2= str_replace("'","''",$REQ); // les remplacements que je fais un à un (voir code au dessus)
  3. $ligne = "SELECT REQUETE,DATE FROM _REQUETES_ WHERE REQUETE LIKE '".$REQDB2."'";
  4. $requete_sql = pg_query($cursor, $ligne);
  5. if (!$requete_sql)
  6.  { print $requete_sql. "Une erreur s'est produite. ligne 42"; exit;
  7. }
  8. while ($row = pg_fetch_row($requete_sql))
  9. {
  10.  if ($row[0] == $REQDB2)
  11.   { $REQUETE_DEJA_ENREGISTREE='1';
  12.    $TUXB=$row[1];
  13.   }
  14. }
  15. if ($REQUETE_DEJA_ENREGISTREE=='0')
  16. {
  17. // ETAPE 1 CREER LES TABLES REQUETES
  18. ...///...
  19. // ETAPE 2 ON RECHERCHE LES LIGNES


Là je fais un INCLUDE qui se trouve ci-dessous

Code :
  1. $ligneA = "SELECT ARTICLE, TITLE, TEXT, RACINE FROM TEST2 WHERE TEXT ILIKE $1 OR TITLE ILIKE $1 OR TEXT ILIKE $2 OR TITLE ILIKE $2 OR TEXT ILIKE $3 OR TITLE ILIKE $3 OR
  2. TEXT ILIKE $4 OR TITLE ILIKE $4 OR  TEXT ILIKE $5 OR TITLE ILIKE $5";
  3. $Recherche_Ilike = pg_query_params($cursor, $ligneA, array('% '.$REQDB2.' %','% '.$REQDB2.'.%','%'.$REQDB2.',%','%.'.$REQDB2.' %','%'.$REQDB2.' %'));
  4. if (!$Recherche_Ilike)
  5.  { print "Une erreur s'est produite. ";exit; }
  6. // je sais je devrais la passer en query_params ci dessous mais la ca change pas grand chose donc je le ferai plus tard.
  7. $ligneC = "SELECT COUNT (URL) FROM TEST2 WHERE TEXT ILIKE '".$REQDB2."'";
  8. $requete_sql = pg_query($cursor, $ligneC);
  9.    while ($row = pg_fetch_row($requete_sql))
  10.    {
  11.    print $row[0];
  12.    }


ALORS LE PROBLEME:
Dans mon include ci-dessus, la recherche s'effectue puisque je vois bien qu'il mouline ==> str_replace(" ' "," ' ' ",$REQ)
Donc je me dis que la requete est comprise par POSTGRESQL (dans le cas contraire il me plante direct)
Or il ne trouve rien...... il me retourne un nombre de lignes = 0....


---------------
http://www.ypikay.com
Reply

Marsh Posté le 01-04-2020 à 14:23:05   

Reply

Marsh Posté le 01-04-2020 à 14:54:02    

Typiquement un cas ou tu veux utiliser PDO et ne surtout pas passer les parametres tels quels.
 
https://www.postgresqltutorial.com/ [...] php/query/
 
Cherche "bindValue" dans cette page pour voir un exemple.
 
En utilisant bindValue: plus besoin de faire gaffe aux apostrophes & co, le systeme s'en occupe pour toi et garanti que les injections SQL ne soient pas possible (uniquement bien sur si tu utilises tout le temps bindValues)
 
EDIT: si tu ne peux pas changer pour PDO (qui est ce qui est recommandé aujourd'hui), l'alternative "old school" c'est celle la:
https://www.php.net/manual/fr/funct [...] params.php
 
Et pas pg_query qui ne devrait jamais prendre de parametre comme ca...


Message édité par Devil'sTiger le 01-04-2020 à 14:55:22
Reply

Marsh Posté le 01-04-2020 à 17:34:05    

Merci beaucoup.
Mais j'utilise query params.  
Je vais voir ton histoire de binValue.  
Merci


---------------
http://www.ypikay.com
Reply

Marsh Posté le 01-04-2020 à 18:56:45    

Bon je reviens à la charge. Je ne sais toujours pas quel chr il faut lui passer à PostGresql....
tous les exemples ci dessous plantent.
Merci de votre aide.
 

Code :
  1. $array = array("l''histoire","l\'histoire","l\\'histoire","l\'\'histoire","l\''histoire","l\''histoire","l'histoire" );
  2. foreach ($array as &$REQ)
  3. {
  4. print "<br>".$REQ."<br>";
  5. $ligne = "SELECT URL, TITLE, TEXT, RACINE FROM TEST2 WHERE
  6. TITLE ~* ' ".$REQ." ' OR
  7. TEXT  ~* '".$REQ." '
  8. ";
  9. print $ligne;
  10.  $requete_sql = pg_query($cursor, $ligne);
  11.  //$requete_sql = pg_query_params($cursor, $ligne, array($REQ));
  12. print $ligne.'<br>';
  13.  if (!$requete_sql)
  14.   { print 'exit0'; }



---------------
http://www.ypikay.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed