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 :

de Mysqli à PDO


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut de Mysqli à PDO
    Bonsoir à tous,
    Je viens de trouver un script qui répond parfaitement à mes attentes mais qui est en mysqli et mon site en PDO.
    Et je vous avoue nager completement la.
    Si une âme charitable passe par là
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    <?php
    $link = mysqli_connect("localhost","root","","addrow") or die("Error " . mysqli_error($link));
     
    // store in the DB 
    if(!empty($_POST['ok'])) {	
    	// first delete the records marked for deletion. Why? Because we don't want to process them in the code below
    	if( !empty($_POST['delete_ids']) and is_array($_POST['delete_ids'])) {
    		// you can optimize below into a single query, but let's keep it simple and clear for now:
    		foreach($_POST['delete_ids'] as $id) {
    			$sql = "DELETE FROM products WHERE id=$id";
    			$link->query($sql);
    		}
    	}
     
    	// now, to edit the existing data, we have to select all the records in a variable.
    	$sql="SELECT * FROM products ORDER BY id";
    	$result = $link->query($sql);
     
    	// now edit them
    	while($product = mysqli_fetch_array($result)) {
    		// remember how we constructed the field names above? This was with the idea to access the values easy now
    		$sql = "UPDATE products SET qty='".$_POST['qty'.$product['id']]."', name='".$_POST['name'.$product['id']]."'
    		WHERE id='$product[id]'";		
    		$link->query($sql);
    	}
    	// (feel free to optimize this so query is executed only when a product is actually changed)
     
    	// adding new products
    	if(!empty($_POST['qty'])) {
    		foreach($_POST['qty'] as $cnt => $qty) {
    			$sql = "INSERT INTO products (qty, name) VALUES ('$qty', '".$_POST['name'][$cnt]."');";
    			$link->query($sql);
    		}
    	}	
    }
     
    // select existing products here
    $sql="SELECT * FROM products ORDER BY id";
    $result = $link->query($sql);
     
     
    while($product = mysqli_fetch_array($result)): ?>
    		<p id="oldRow<?=$product['id']?>">
    		Item quantity: <input type="text" name="qty<?=$product['id']?>" size="4" value="<?=$product['qty']?>" /> 
    		Item name: <input type="text" name="name<?=$product['id']?>" value="<?=$product['name']?>" /> 
    		<input type="checkbox" name="delete_ids[]" value="<?=$product['id']?>"> Mark to delete<
    	<?php endwhile;?>

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut
    J'avance à petits pas, mais je tombe sur 2 erreurs que je ne comprend pas

    Warning: Invalid argument supplied for foreach() in.......
    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
    foreach($_POST['id'] as $id) {
        $req = $bdd->prepare("UPDATE products SET qty=:qty, name=:name WHERE id=".$id."");  
        $req->bindValue(':id', $id);
        $req->execute();
    }
     
     
     
     
    if(!empty($_POST['qty'])) {
            foreach($_POST['qty'] as $cnt => $qty) {
                $req = $bdd->prepare("INSERT INTO products (qty, name) VALUES (".$qty.", '".$_POST['name'][$cnt]."');");
                $req->execute();
                $result = $req->fetch(PDO::FETCH_OBJ);
            }
        }

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Août 2007
    Messages : 314
    Points : 217
    Points
    217
    Par défaut
    fais un var_dump
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var_dump($_POST['id']) ;
    ça donne quoi ?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut
    Le var_dump m'affiche : string '52' (length=2)

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Août 2007
    Messages : 314
    Points : 217
    Points
    217
    Par défaut
    voilà donc c'est une chaine de caractère pas un tableau .

    foreach sert à parcourir un tableau ou un objet ( les attributs ).

    doc officielle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    La structure de langage foreach fournit une façon simple de parcourir des tableaux.
     foreach ne fonctionne que pour les tableaux et les objets, 
    et émettra une erreur si vous tentez de l'utiliser sur une variable de type différent ou une variable non initialisée.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut
    heuu ok, et tu me conseilles quoi?

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Août 2007
    Messages : 314
    Points : 217
    Points
    217
    Par défaut
    ça déponds de ta logique , pourquoi tu veux parcourir le superglobale $_POST['id'] et n'est pas un tableau ou objet ?

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut
    Pour tout te dire je suis un peu perdu la. Je suis en train d'essayer de passer en PDO le code en Mysqli ci dessus. J'ai donc repris la logique utilisée pour mon site qui est en objet.
    Mais ça ne me réussi pas trop.
    je te met le code modifié si c'est plus parlant.

    sachant tout de même que la partie foreach=>INSERT m'affiche une erreur mais enregistre les données.
    la partie foreach=>UPDATE ne fait rien d'autre que m'afficher l'erreur.
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <?php
    if(!empty($_POST['ok'])) {	
    	// first delete the records marked for deletion. Why? Because we don't want to process them in the code below
    	if( !empty($_POST['delete_ids']) and is_array($_POST['delete_ids'])) {
    		// you can optimize below into a single query, but let's keep it simple and clear for now:
    		foreach($_POST['delete_ids'] as $id) {
    			$req = $bdd->prepare('DELETE FROM products WHERE id='.$id.'');
    			$req->execute();
    			$result = $req->fetch(PDO::FETCH_ASSOC);
    		}
    	}
     
    	$req = $bdd->prepare('SELECT * FROM products ORDER BY id');
    	$req->execute();
    	$result = $req->fetch(PDO::FETCH_OBJ);
     
     
    	foreach($_POST['id'] as $id) {
    		$req = $bdd->prepare("UPDATE products SET qty=:qty, name=:name WHERE id=".$id."");	
    		$req->bindValue(':id', $id);
    		$req->execute();
    	}
    	var_dump($_POST['id']) ;
     
     
    	if(!empty($_POST['qty'])) {
    		foreach($_POST['qty'] as $cnt => $qty) {
    			$req = $bdd->prepare("INSERT INTO products (qty, name) VALUES (".$qty.", '".$_POST['name'][$cnt]."');");
    			$req->execute();
    			$result = $req->fetch(PDO::FETCH_OBJ);
    		}
    	}
    }
     
     
    $req = $bdd->prepare('SELECT * FROM products ORDER BY id');
    $req->execute();
    $result = $req->fetch(PDO::FETCH_OBJ);
    ?>
    <?php
    	// let's assume you have the product data from the DB in variable called $products
    	while ($result = $req->fetch(PDO::FETCH_OBJ)){ ?>
    		<p id="oldRow">
    		id : <input type="text" name="id" value="<?php echo $result->id;?>" /> 
    		Item quantity: <input type="text" name="qty" size="4" value="<?php echo $result->qty;?>" /> 
    		Item name: <input type="text" name="name" value="<?php echo $result->name;?>" /> 
    		<input type="checkbox" name="delete_ids[]" value="<?php echo $result->id;?>"> Mark to delete<
    	<?php }?>
    	</div>
    	<p><input type="submit" name="ok" value="Save Changes"></p>
    	</form>

  9. #9
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Dans ta logique de code,$_POST['id'] devrait être un tableau, or c'est une chaîne de caractère, d'où ton erreur..
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut
    Ok ok, mais concretement ca pourrait donner quoi?

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans ton code de départ il n'y a pas de $_POST['id'] ; qu'est ce que tu as changé dans ton formulaire ?

    Également, on ne fait pas un "prepare" dans une boucle.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut
    Salut sabotage,
    J'ai effectivement remplacé le prepare par exec.
    Ensuite, dans le formulaire , je n'ai aucune idée de ce qu'est <input type="text" name="qty<?=$product['id']?>" size="4" value="<?=$product['qty']?>" /> j'en ai conclu que ça permettais de récupérer l'id, donc j'ai rajouté ceci id : <input type="hidden" name="id" value="<?php echo $result->id;?>" />
    d'ou par la suite mon $_POST['id']

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si ton but est de modifier ton code mysqli vers PDO, il n'y a rien a changer dans le formulaire ni dans les boucles de traitement, ni dans les variables en jeu, ni dans les requêtes : seulement les éléments mysqli par PDO.
    Donc dans ton cas la fonction mysqli_fetch_array() est remplacé par le méthode PDO fetch()
    et la méthode mysqli query() est remplacé par exec() ou query() selon que tu faire une lecture ou une ecriture.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    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
    sur Sabotage. Et si tu veux changer le fonctionnement du formulaire, il faut aussi changer le formulaire lui-même.

    Au passage, l'idéal serait d'utiliser des requêtes préparées, pasque bon sinon on perd un peu de l'intérêt de PDO (mais comme le script d'origine n'utilise pas non plus les requêtes préparées avec mysqli... )
    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]

  15. #15
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut
    Merci de votre aide.....
    je vais voir tout ca. bonne soirée

Discussions similaires

  1. [PDO] MySqli vers Pdo
    Par okoweb dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/05/2010, 21h08
  2. [MySQL] Avis entre PDO et MYSQLI
    Par saebakun dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/12/2008, 14h40

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