IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Modifier mon code de mysql en mysqli avec des include et require


Sujet :

PHP & Base de données

  1. #21
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par Celira Voir le message
    On est pas méchants, c'est juste qu'on aime pas mysqli, et que du coup, on ne l'utilise pas. Et par conséquent, qu'on est 1) moins motivés et 2) peu compétents pour t'aider avec mysqli.
    Alors que PDO on gère, hein les gars

    ~Celira repense au tuto PDO qu'elle avait envisagé d'écrire en janvier et qui n'est toujours pas écrit...~
    Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto Un tuto je veux un tuto, car je suis nul, je veux un tuto car je suis hyper nul et puis vous m'abandonnez si je ne viens pas sur PDO, alors je veux mon tuto, s'il vous plaitttttttttttttttt !!!!!

  2. #22
    Invité
    Invité(e)
    Par défaut
    Sauf erreur, je t'ai DEJA donné ce lien :




    Mais c'est sûr : ça te prendra un peu plus d'une heure pour modifier tous tes scripts....

  3. #23
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Je vous remercie tous pour votre dévouement, mais la je ne comprends pas, je viens de parcourir les diverses infos présentes sur PDO notamment http://fmaz.developpez.com/tutoriels...omprendre-pdo/ et je ne comprends pas la raison de passer a PDO, meme celui qui a réalisé le tuto parle de "Si les requêtes préparées ont été introduites avec MySQL 4.1, il faut admettre que leur utilisation était plutôt complexe, longue et surtout pénible. "

    Est ce que la sécurité contre les injections justifie de se prendre la tête a ecrire 30lignes la ou mysql ou mysqli le fait en 3 lignes ?

    Attention, je ne veux pas être têtu, je veux juste comprendre, et vous ne perdrez pas votre temps à m'expliquer, je vous l'assure.

    Est ce que l’intérêt principal de PDO est de l'utiliser au travers des requêtes préparées, car la sécurité est plus sure si l'on sépare les valeurs des commandes ?

    Je vous dis ça car ce qui me fait peur c'est que j'ai un bon milliers de fonctions mysql a changer et j'ai juste 5 jours pour le faire, et aucune n'est pareille a l'autre, donc aucun intérêt a passer par une requête préparée.

    Je sais que vous êtes Pro-PDO, mais quand meme, rien qu'en lisant je suis flippé, je vous donne des exemples des mes fonctions mysql classiques que j'utilise et rien que pour le while chez PDO je n'ai rien compris :

    Ma connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    	$pdo_conn			= array();
    	$pdo_conn['hostname']	= 'xxxxx';
    	$pdo_conn['database']	= 'xxxxx';
    	$pdo_conn['username']	= 'xxxxx';
    	$pdo_conn['password']	= 'xxxxx';
     
    try {
    	$pdo_conn['strConn'] 	= 'mysql:host='.$pdo_conn['hostname'].';dbname='.$pdo_conn['database'];
    	$pdo_conn['extraParam']	= array(	PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => true, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
    	$pdo->query("SET NAMES 'utf8'"); // j'ai rajouté cette syntaxe car apparemment MYSQL_ATTR_INIT_COMMAND ne fonctionne pas selon la version de PHP
    	$pdo = new PDO($pdo_conn['strConn'], $pdo_conn['username'], $pdo_conn['password'], $pdo_conn['extraParam']);
    }
    catch(PDOException $e){$msg = 'ERREUR PDO dans ' . $e->getFile().' L.' . $e->getLine().' : ' . $e->getMessage(); die($msg);}
            $pdo_conn			= array();
    Je definie mes 2 variables de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $suff_table="nomdematable_";
    $idC='2';
    Je test differentes séquences en mysql et PDO:

    SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    MYSQL
    $res = mysql_query("SELECT * FROM `".$suff_table."A` A, `".$suff_table."B` B where A.idC=B.idC and A.idC='$idC'");
    while($cl = mysql_fetch_array($res, MYSQL_ASSOC))
    {
      $nom=$cl['nom'];
      $prenom=$cl['prenom'];
    }
    
    PDO
    $re_S = $pdo ->query("SELECT nom,prenom FROM `".$suff_table."A` A, `".$suff_table."B` B where A.idC=B.idC and A.idC='$idC'");
    while ($test=$re_S ->fetch()){
      $nom=$test->nom;
      $prenom=$test->prenom;
    }

    INSERT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MYSQL
    $modif=mysql_query("INSERT INTO `".$suff_table."A` (`idC`) VALUES ('$idC')");
    
    PDO
    $re_I = $PDO->prepare("INSERT INTO `".$suff_table."A` (nom, prenom) VALUES (:nom, :prenom)");
    $re_I ->execute(array(
                "nom" => $nom, 
                "prenom" => $prenom
                ));
    UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MYSQL
    $modif=mysql_query("UPDATE `".$suff_table."A` SET nom='toto' WHERE idC='$idC'");
    
    PDO
    $re_U = $pdo ->prepare('UPDATE `".$suff_table."A` SET nom= ? WHERE idC = ?');
    $re_U ->execute(array($_POST['idC']));

    Par contre pour celles la je sèche un peu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MYSQL
    $res = mysql_query("SELECT * FROM `".$suff_table."A` where idC='$idC'");
    $nb=mysql_num_rows($res);
    if ($nb==0){
    }
    
    Est ce cela que l'on doit écrire en PDO .
    $re_NB = $pdo ->query("SELECT nom,prenom FROM `".$suff_table."A` A, `".$suff_table."B` B where A.idC=B.idC and A.idC='$idC'");
    $NB = $re_NB ->rowCount();
    ////

    Est ce que cela est correct en PDO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $somme = $pdo ->query("SELECT SUM(totfin) as com FROM `".$suff_table."A` A, `".$suff_table."B` B  where A.idC=B.idC and A.idC='$idC'");
    ?

    Et si oui je ne trouve pas l'equivalent de cette syntaxe mysql en PDO s'il vous plait l'équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $tot = mysql_result($somme , 0, 'com');
    $tot=ceil($totMT_1/1000);
    Merci pour ces premieres aides Ô combien précieuse pour moi.
    Bonne journée a tous

  4. #24
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Les requêtes préparées sous mysqli sont une plaie à mon avis. Mais personne ne t'oblige à utiliser les requêtes préparées. On te conseille seulement d'échapper les données qui proviennent de l'extérieur. C'est
    parfaitement possible sans requête préparée.
    Dans les exemples suivants, on fait une requête qui utilise une donnée issue d'un formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    $cmail = (isset($_POST['username'])) ? $_POST['username'] : '';
     
    // API mysql obsolète
    $cmail_escape = mysql_real_escape_string($cmail);
    mysql_query("SELECT * FROM `".$suff_table."utilisateur` where a_mail='$cmail_escape' or a_pseudo='$cmail_escape'");
     
    // mysqli procedural
    $cmail_escape = mysqli_real_escape_string($bdd, $cmail);
    mysqli_query($bdd, "SELECT * FROM `".$suff_table."utilisateur` where a_mail='$cmail_escape' or a_pseudo='$cmail_escape'");
     
    // mysqli avec requête préparée
    $stmt = mysqli_prepare($bdd, "SELECT * FROM `".$suff_table."utilisateur` where a_mail=? or a_pseudo=?");
    $stmt->bind_param('ss', $cmail, $cmail);
    $stmt->execute();
     
    // pdo avec query
    $cmail_escape = $pdo->quote($cmail);
    $pdo->query("SELECT * FROM `".$suff_table."utilisateur` where a_mail='$cmail_escape' or a_pseudo='$cmail_escape'");
     
    // pdo avec requête préparée
    $stmt = $pdo->prepare($bdd, "SELECT * FROM `".$suff_table."utilisateur` where a_mail=:a_mail or a_pseudo=:a_pseudo");
    $stmt->execute(array(':a_mail' => $cmail, ':a_pseudo' => $cmail));

    Pour le num_rows :
    il est écrit dans la doc de rowCount() :
    PDOStatement::rowCount() retourne le nombre de lignes affectées par la dernière requête DELETE, INSERT ou UPDATE exécutée par l'objet PDOStatement correspondant.

    Si la dernière requête SQL exécutée par l'objet PDOStatement associé est une requête de type SELECT, quelques bases de données retourneront le nombre de lignes retournées par cette requête. Néanmoins, ce comportement n'est pas garanti pour toutes les bases de données et ne devrait pas être exécuté pour des applications portables.
    Mais toi, tu n'as pas une application portable, mais une pure MySQL, et rowCount marche très bien sur les SELECT avec MySQL.

    Pour la requête SUM (ou toute requête avec un seul champ retourné), tu peux utiliser fetchColumn
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $res = $pdo ->query("SELECT SUM(totfin) as com FROM ....");
    $tot  $res->fetchColumn();
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #25
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Salut,
    Attention tout de même à PDO::quote ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $cmail_escape = $pdo->quote($cmail); // ajoutera aussi '' autour de la valeur $cmail_escape
    $pdo->query("SELECT * FROM `".$suff_table."utilisateur` where a_mail='$cmail_escape' or a_pseudo='$cmail_escape'");
    est problématique

    Pour le rowCount, bien vrai qu'il fonctionne avec MYSQL (que si PDO::MYSQL_ATTR_USE_BUFFERED_QUERY est à TRUE , ce qui est le cas par défaut), il est mieux d'utiliser un COUNT ou tout autre méthode côté SQL pour avoir le nombre de lignes.

    Pour la connexion, au niveau du charset à partir de PHP 5.3.6, il est conseillé d'utiliser ;charset=xxxx http://php.net/manual/fr/mysqlinfo.concepts.charset.php
    Les jointures internes s'écrivent avec JOIN ou INNER JOIN mais bon ce n'est pas le sujet.
    $nom=$test->nom; va renvoyer une erreur car vous avez simplement $re_S ->fetch() et non $re_S->fetch(PDO::FETCH_OBJ);
    Pour une requête renvoyant une seule ligne, pas besoin de while
    Le bienfait n'est jamais perdu

  6. #26
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par Celira Voir le message
    Les requêtes préparées sous mysqli sont une plaie à mon avis. Mais personne ne t'oblige à utiliser les requêtes préparées. On te conseille seulement d'échapper les données qui proviennent de l'extérieur. C'est
    parfaitement possible sans requête préparée. ....
    Dans mon code, je n'ai pas besoin d'echapper les données puisque celles-ci sont deja hachées via md5, donc ce ne peut être qu'une serie de chiffres qui se presente sous la forme d'une valeur .

    Je vais tenter de faire des tests en passant tout sous PDO pour voir si je galère ou pas.

    Merci en tout cas a tous

Discussions similaires

  1. [XL-2007] Modifier mon code
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/08/2014, 10h20
  2. [MySQL] aider moi a modifier mon code
    Par tapoza dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 11/06/2011, 17h59
  3. [Tableaux] comment doit-je modifier mon code
    Par teen6517 dans le forum Langage
    Réponses: 10
    Dernier message: 27/02/2007, 13h22
  4. Qui modifie mon code PL?
    Par flonardi dans le forum Oracle
    Réponses: 3
    Dernier message: 31/05/2006, 10h44
  5. CSS comment puis-je modifier mon code pr avoir un bord blanc
    Par pierrot10 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 30/09/2005, 20h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo