Partage
  • Partager sur Facebook
  • Partager sur Twitter

PDO -> mysql_real_escape_string

4 avril 2010 à 17:30:00

Salut,

comme le tire le sous entend, j'aimerai savoir quel est l'équivalent de mysql_real_escape_string dans la class PDO ?

En effet, j'ai découvert depuis peu que le tutoriel PHP/Mysql avait changé et qu'il fallait mieux utiliser la class PDO plutôt que mysql_ ...

Comme j'avais l'habitude de toujours passer mes variables dans mysql_real_escape_string, je suis un peu perdu avec PDO car je ne trouve pas l'équivalent...

Merci de m'éclairer :)
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 17:31:40

pas besoin d'échapper des string si tu utilises des requêtes préparés. Sinon c'est quote().
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 17:32:14

Le premier réflexe que tu dois avoir, c'est allé voir la doc : http://www.php.net/pdo

Regarde un peu les méthodes de la classe PDO, tu devrais trouver rapidement.

Semi-edit: Mouais, t'as la réponse, je poste quand même car tu aurais dû toi-même la trouver.
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 17:36:26

J'avais trouvé le quote(); mais le soucis, c'est que ca ajoute des quotes autour de mes variable (logique) alors ce code bug :

<?php
$page = $pdo->quote($_GET['page']);
$return = $pdo->query('SELECT * FROM maTable WHERE page = ' . $page . '');
?>


Je vais retourner voir la doc :)
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 18:06:03

Évidemment, tu ne devrais pas utiliser PDO::quote() si ce n'est pas pour échapper une chaîne (ça vaut aussi pour mysql_real_escape_string).

Je te suggère d'utiliser les requêtes préparées, avec PDOStatement::bindValue (ou bindParam, selon le cas), ça permet un code beaucoup plus clair.
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 19:08:10

De manière plus propre:
<?php
$return = $pdo->prepare( 'SELECT * FROM maTable WHERE page = :page' );
$return = $return->execute( array( 'page' => $_GET['page'] ) );
Ou encore plus propre:
<?php
$return = $pdo->prepare( 'SELECT * FROM maTable WHERE page = :page' );
$return->bindValue( 'page', $_GET['page'], PDO::PARAM_INT );
$return = $return->execute():
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 19:10:17

Ça serait encore plus propre avec bindValue et PARAM_INT, le numéro d'une page n'est pas une chaîne (bien que les SGBD vont quand même l'accepter).
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 19:15:34

Quelle est la différence entre bindParam et bindValue ? (je comprends pas sur la doc)
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 19:27:19

bindParam passe la variable en référence à la requête. Je vois difficilement comment l'expliquer autrement qu'avec un exemple :
<?php
    $id = 0;
    $nom = 'Test_';

    $statement = $pdo->prepare("INSERT INTO test (id, nom) VALUES (:id, :nom)");
    $statement->bindParam('id', $id, PDO::PARAM_INT);
    $statement->bindParam('nom', $nom, PDO::PARAM_STR);

    for ($i = 0; $i < 5; $i++) {
        $id = $i;
        $nom = 'Test_' . $i;
        $statement->execute();
    }
?>


Bref, ça simplifie beaucoup le code, on a 5 requêtes différentes qui seront exécutées.

Avec bindValue, c'est seulement la valeur qui est transmise. Il faudrait donc refaire un bindValue dans la boucle.
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 19:53:32

Ah yes passage par valeur/référence okay merci

Je suppose que niveau perfs bindValue est plus rapide ?
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 19:56:15

Je suis pas convaincu, mais j'ai jamais fait les tests. Enfin, j'imagine que c'est un peu plus rapide d'utiliser bindValue, mais dans mon exemple précédent, il serait probablement plus lent d'utiliser bindValue dans la boucle.
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2010 à 20:03:53

Oui bien sûr, je voulais dire un bindValue() vs un bindParam() :)
Sujet résolu alors ?
  • Partager sur Facebook
  • Partager sur Twitter
25 août 2021 à 18:50:19 - Message modéré pour le motif suivant : Message complètement hors sujet


25 août 2021 à 18:53:06

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter