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

Langage PHP Discussion :

Insert impossible pour les chiffres


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Insert impossible pour les chiffres
    Bonsoir,

    J'ai une requête insert pour une table de ma BDD.

    Trois variables sont récupérées via $_POST; Une est en dur (un seul chiffre ID_LANG) et une est récupérée via un select sur une autre table (ID_PLAT) et s'affiche bien avec un "echo". Voici ma requête actuelle :
    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
    // J'appelle l'ID_PLAT de la table PLATS
    $sql_id_plat = $DB_connect->query("SELECT nom_plat, id_plat FROM plats where nom_plat = '".$_POST['nom_plat_FR']."'");
    	while ($donnees = $sql_id_plat->fetch_array())
    	{
    		echo $donnees['id_plat']; 
    	}
    	$essai = $donnees['id_plat'] ;
    	echo $essai; echo '<br>';
    //	$essai = (int)$essai;
    //	echo $essai; echo '<br>';
     
    	//Requete INSERT dans PLAT_LANG. ID_PLAT vient de la requête précédante et ID_LANG est en dur dans cette requête...
    $sql_plats_lang =  "INSERT  INTO plat_lang (id_plat, id_lang, nom_plat, alt_plat, descr_plat)
    VALUES ( '".$essai."', 0, '".$_POST['nom_plat_FR']."', '".$_POST['nom_plat_FR']."', '".$_POST['descr_plat_FR']."') " ;
    if (!$result = $mysqli->query($sql_plats_lang)) {
        // Si la requête échoue. 
        echo "Désolé, Le site a quelques problèmes.";
        echo "Erreur: Le traitement a failli, voici pourquoi : \n";
        echo "Requête : " . $sql_plats_lang . "\n";
        echo "Err. no : " . $mysqli->errno . "\n";
        echo "Type d'erreur : " . $mysqli->error . "\n";
    }
    Quoi que je fasse, quelle que soit la syntaxe, avec points ou sans, avec guillemets, grands, petits, anti et autres et même sans rien du tout cette valeur n'arrive pas en place. J'ai, à un moment, essayé de mettre $monid = (int)monid; et... j'ai enfin enregistré ma requête dans la base mais ce n'est pas l'identifiant attendu qui est passé mais un... 0 !
    La plus part du temps j'ai un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "Requête : INSERT INTO plat_lang (id_plat, id_lang, nom_plat, alt_plat, descr_plat)
    VALUES ( '', 0, 'Poulet au curry', 'Poulet au curry', 'Un bon poulet avec un curry pas mal épicé') Err. no : 1366 Type d'erreur : Incorrect integer value: '' for column 'id_plat' at row 1"
    Et puis l'autre valeur qui ne passe pas est le 0 (id de la langue française). Alors j'ai changé pour mettre un "1" mais la aussi j'ai une erreur de syntaxe annoncée... Pourtant ce n'est qu'un caractère mais non je n'arrive pas à trouver la voie !!!

    Je me demande si ce n'est pas plutôt ma BDD qui est mal configurée et donc allergique aux chiffres ?!
    J'ai enlevé les "unsigned zero fill", croyant que ce pouvait être les zéros en début de mes ID (qui proviennent d'autres tables pour les quelles elles sont définies en clefs primaires)...

    Pourriez-vous me donner un coup de pouce SVP ? Merci d'avance et bonne soirée à tous.

  2. #2
    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
    Il faudrait nous donner un code et le message d'erreur que ce code produi ; pas un essai de code avec une erreur qui correspond à un autre essai.

    La dans l'erreur que tu nous montres, on voit bien que $essai est vide ; hors tu nous dis toi que le echo te l'affiche.

    C'est une drôle d'idée d'avoir ajouté des zeros dans tes ids, tu devrais refaire des ids propres.

    Au passage, on ne met pas des données POST dans une requête, c'est une faille de sécurité majeure : il faut passer par une requête préparée ou au moins échapper les valeurs.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Merci de ta réponse,
    Effectivement il est vide ! Mais c'est justement le pourquoi de ma question : pourquoi est-il vide ?
    voici le message qu'il me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    8 // id_plat sorti du while !!! Et oui ! il s'affiche !!! 
    Désolé, Le site a quelques problèmes.Erreur: Le traitement a failli, voici pourquoi : Requête : INSERT INTO plat_lang (id_plat, id_lang, nom_plat, alt_plat, descr_plat)
    VALUES ( '', 0, 'Poulet au curry', 'Poulet au curry', 'Un bon poulet avec un curry pas mal épicé') Err. no : 1366 Type d'erreur : Incorrect integer value: '' for column 'id_plat' at row 1
    Et voici le code des deux queries ($sql_id_plat et $sql_plats_lang). Il y a une autre query au dessus mais elle est fonctionnelle, elle insère les données du plat et je récupère l'ID_PLAT auto incrémenté par cet INSERT et qui ressort de mon SELECT, ici, dans ce bout de code, ma première requête ($sql_id_plat).

    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
    // J'appelle l'ID_PLAT du plat inséré ci-dessus
    $sql_id_plat = $DB_connect->query("SELECT nom_plat, id_plat FROM plats where nom_plat = '".$_POST['nom_plat_FR']."'");
    	while ($donnees = $sql_id_plat->fetch_array())
    	{
    		echo $donnees['id_plat']; 
    	}
    // J'ai essayé £données[id_plat] avec toutes sortes de points côtes etc
    //J'ai aussi essayé $essai... idem il me sort toujours la même erreur
    // Je me demande même si le type de langue "0", FR, ne va pas me poser de PB....	
    	$essai = $donnees['id_plat'] ;
    	echo $essai; echo '<br>';
     
    	//Requete inserte dans PLAT_LANG
    $sql_plats_lang = 	"INSERT  INTO plat_lang (id_plat, id_lang, nom_plat, alt_plat, descr_plat)
    					VALUES ( '".$essai."', 0, '".$_POST['nom_plat_FR']."', '".$_POST['nom_plat_FR']."', '".$_POST['descr_plat_FR']."') " ;
    if (!$result = $mysqli->query($sql_plats_lang)) {
        // Si la requête échoue. 
        echo "Désolé, Le site a quelques problèmes.";
        echo "Erreur: Le traitement a failli, voici pourquoi : \n";
        echo "Requête : " . $sql_plats_lang . "\n";
        echo "Err. no : " . $mysqli->errno . "\n";
        echo "Type d'erreur : " . $mysqli->error . "\n";
    }
    Pour ce qui est des zero fill c'est peut-être une drôle d'idée, mais cela ne change rien, je connais plein de gars qui les mettent... Pour ma part je les ai enlevés de toutes mes tables.
    Il faut dire aussi que je viens de loin. J'ai appris le COBOL et le RPG il y a plus de vingt ans (et oui ! à la fin du siècle dernier ) alors depuis deux semaines que je fais du php, après n'avoir jamais appliqué ni COBOL, ni RPG, qui n'ont rien à voir avec le PHP, je peux t'assurer que des "drôles d'idées j'en ai eu
    Pour finir je sais que les $_POST sont des failles de sécu possibles. Mais j'arrive déjà pas à passer une variable, alors trois de plus....
    Ce site ne sera jamais mis en ligne, il me sert à découvrir le PHP et la première chose que je dois faire c'est "remplir ma base" avec les tables en relation. D'où ma demande d'aide.

    Merci encore de vos réponses...

  4. #4
    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
    Pour qu'on soit d'accord ... le echo $essai il t'affiche l'id ou pas ?
    Moi je dis que non puisque tu as défini $essai après la boucle qui lit la base de données. La dernière valeur de $donnees c'est FALSE (plus de lignes à lire)
    Mais d'ailleurs tu n'as pas besoin de boucle puisque tu n'attends qu'un seul résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql_id_plat = $DB_connect->query("SELECT nom_plat, id_plat FROM plats where nom_plat = '". $DB_connect->real_escape_string($_POST['nom_plat_FR'])."'");
    $id_plat = $donnees['id_plat'];
    Bon pour bon faire les choses il faudrait vérifier qu'on a trouvé un résultat avant de se lancer dans la suite.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Non, c'est l'echo du while qui s'affiche...
    Mais même si je mets dans ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql_plats_lang = 	"INSERT  INTO plat_lang (id_plat, id_lang, nom_plat, alt_plat, descr_plat)
    					VALUES ( '".$donnees['id_plat']."', 0, '".$_POST['nom_plat_FR']."', '".$_POST['nom_plat_FR']."', '".$_POST['descr_plat_FR']."') " ;
    le message reste le même...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Requête : INSERT INTO plat_lang (id_plat, id_lang, nom_plat, alt_plat, descr_plat)
    VALUES ( '', 0, 'Poulet au curry', 'Poulet au curry', 'Un bon poulet avec un curry pas mal épicé') Err. no : 1366 Type d'erreur : Incorrect integer value: '' for column 'id_plat' at row 1

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Il me donne une erreur :

    Notice: Undefined variable: donnees in C:\wamp64\www\Site\html\essai.php on line xx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    / J'appelle l'ID_PLAT du plat inséré ci-dessus
    $sql_id_plat = $DB_connect->query("SELECT id_plat FROM plats where nom_plat = '". $DB_connect->real_escape_string($_POST['nom_plat_FR'])."'");
     
    $id_plat = $donnees['id_plat']; 
     
    	//Requete inserte dans PLAT_LANG
    $sql_plats_lang = 	"INSERT  INTO plat_lang (id_plat, id_lang, nom_plat, alt_plat, descr_plat)
    					VALUES ( '".$donnees['id_plat']."', 0, '".$_POST['nom_plat_FR']."', '".$_POST['nom_plat_FR']."', '".$_POST['descr_plat_FR']."') " ;
    // comment je passe le résultat de la query dans $donnees ?

  7. #7
    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
    Il manque un petit bout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql_id_plat = $DB_connect->query("SELECT id_plat FROM plats where nom_plat = '". $DB_connect->real_escape_string($_POST['nom_plat_FR'])."'");
    $donnees = $sql_id_plat->fetch_assoc()
    $id_plat = $donnees['id_plat']; 
     
    $sql_plats_lang =  "INSERT  INTO plat_lang (id_plat, id_lang, nom_plat, alt_plat, descr_plat)
    					VALUES (".$id_plat.", 0, '".$DB_connect->real_escape_string($_POST['nom_plat_FR'])."', '".$DB_connect->real_escape_string($_POST['nom_plat_FR'])."', '".$DB_connect->real_escape_string($_POST['descr_plat_FR'])."')";

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Tu sais quoi ???

    ça marche, j'y crois pas !!!

    Vraiment, je te remercie de ton aide, '"précieuse"', c'est super je vais pouvoir avancer enfin.
    Je savais bien que la boucle n'était pas la solution, mais je ne savais pas faire autrement pour récupérer cette p.... d'id et j'avais plus ... d'idées, c'est le cas de le dire.
    De plus c'est le moyen d'éviter la vulnérabilité des $_POST la formule magique "real_escape_string" ?

    Encore MERCI pour ton temps et tes conseils et très bonne soirée à toi

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rogellino Voir le message
    Il faut dire aussi que je viens de loin. J'ai appris le COBOL et le RPG il y a plus de vingt ans (et oui ! à la fin du siècle dernier ) alors depuis deux semaines que je fais du php, après n'avoir jamais appliqué ni COBOL, ni RPG, qui n'ont rien à voir avec le PHP,..
    Effectivement, ça n'a rien à voir. Moi, comme avant de faire du PHP, j'avais codé entre autre en assembleur, la complexité était comparable et la connaissance du langage C m'a bien aidé aussi.
    Pour en venir au PHP, comme tu démarres, gère les bdd MySql en pdo plutôt qu'avec les fonctions mysql_xxx : http://fmaz.developpez.com/tutoriels...omprendre-pdo/


    L'aide-mémoire que je m'étais écrit :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    <?php
    //// connexion
    require('MyPdo.php');
    try{
    		$pdo = new MyPDO();
    	}
    catch(PDOException $e){
    		echo "argggggggggggggg".$e->getMessage();
    	}
     
    // MyPDO
     //la classe MyPdo hérite de la classe PDO (extends)
    class MyPdo extends PDO {
    /* on privilégie les var de classe (statiques) aux constantes : ainsi modifiables par programme */
    	protected $DB_NAME = "xxx";
     
    	protected $HOST = "xxx";
     
    	protected $USER = "xxx";
     
    	protected $PASS = "xxx";
     
     
     
    // le constructeur de MyPdo appelle le constructeur de PDO en lui passant ses paramètres	
    	function __construct() {
    	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    	$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;//important sur les configs récentes
    	$pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;//pour le mode objet
    	$pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";//pour l'utf-8
     
    	parent::__construct('mysql:host=' . MyPdo::$HOST . ';dbname=' . MyPdo::$DB_NAME, MyPdo::$USER, MyPdo::$PASS, $pdo_options);
    	}
     
    }
    // fin MyPDO
     
     
    //// Effectuer une query et un fetch
    $query = 'SELECT * FROM foo WHERE bar=1;';
    $arr = $pdo->query($query)->fetch(); //Sur une même ligne ...
     
     
    //// Effectuer une query et un fetchAll
    $query = 'SELECT name FROM foo WHERE bar<10;';
    $stmt = $pdo->query($query);
    $arrAll = $stmt->fetchAll(); //... ou sur 2 lignes
    /*différence entre fetch et fetchAll : fetch ne retourne que la 1e ligne alors que fetchAll retourne un tableau qui contient ttes les lignes d'où
    un indice de plus. Donc ici, si la réponse ne fait qu'une seule ligne, avec fetch, $row["name"] alors que avec fetchAll $row[0]["name"] */
     
    //// Effectuer un exec
    $query = 'DELETE FROM foo WHERE bar<10;';
    $rowCount = $pdo->exec($query);
     
    //// nb de lignes (mysql_num_rows)
    $query = 'DELETE FROM foo WHERE bar<10;';
    $rowCount = $pdo->exec($query);
    $nb_lignes=$rowCount->rowCount();
     
    // nb de lignes pour un select
    $sql='select * from `users` order by nom';
    $qid = $pdo->query($sql);
    //test de mysql_num_rows
    $num_rows=0;
    while( $ligne=$qid->fetch(PDO::FETCH_OBJ) ) $num_rows++;
    $pdo=NULL;
    echo "nb de lignes=".$num_rows;
     
    ou :
     
    $sql = "SELECT COUNT(*) AS compte FROM `infotech`";
    $qid = $pdo->query($sql);
    $row=$qid->fetch(PDO::FETCH_OBJ);
    $nrows=$row->compte;
     
     
     
    // exécuter un select puis afficher les lignes
    $sql='select * from `conf` order by lastname';
    $qid = $pdo->query($sql);
    while( $ligne=$qid->fetch(PDO::FETCH_NUM) )...
     
    // exécuter un select puis mettre les données en tableau associatif
    $sql='select * from `conf` order by lastname';
    $qid = $pdo->query($sql);
    $data = $qid->fetchAll(PDO::FETCH_ASSOC); 
    echo $data[0]["name"]; // tableau à 2 dimensions
     
    /*différence entre fetch et fetchAll
    fetch ne retourne qu'une ligne à la fois alors que fetchAll retourne un tableau avec ttes les lignes. C'est pourquoi
    qd on fait un select qui ne retourne qu'une seule ligne, après un fetch, on pointe les éléments par (par exemple)
    $data["name"]; et après un fetchAll par $data[0]["name"]; */
     
    // filtrage affichage erreurs
    error_reporting(E_ALL^E_NOTICE^E_DEPRECATED);
     
    //affichage erreur PDO
    print_r(pdo->errorInfo());
     
    //requête préparée
    $query = 'DELETE FROM foo WHERE id=?';
    $qid=$pdo->prepare($query);
    $qid->execute(array($id));
     
    ou 
     
    $query = 'DELETE FROM foo WHERE (id=:id)';
    $qid=$pdo->prepare($query);
    $qid->execute(array(':id'=>$id));
    ?>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. insertion spontanée pour les tests
    Par kobe24 dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/07/2009, 12h19
  2. Réponses: 3
    Dernier message: 17/03/2009, 13h51
  3. Quel type SQL pour les chiffres
    Par marquito dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/06/2007, 15h23
  4. Connexion entrante impossible pour les serveurs de validation W3C
    Par Squalthor dans le forum Serveurs (Apache, IIS,...)
    Réponses: 30
    Dernier message: 13/10/2006, 17h10
  5. champ juste pour les chiffres
    Par H-bil dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 18/05/2006, 14h50

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