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 :

INSERT DATE dans une table [PDO]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Septembre 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2018
    Messages : 23
    Points : 9
    Points
    9
    Par défaut INSERT DATE dans une table
    Bonjour,

    Je suis en train de modifier toutes mes anciennes requêtes mysql avec PDO mais je bloque sur l'insert de la date dans une table.
    Je ne suis apparemment pas la seule mais impossible de trouver une déclaration et/ou un format d'insertion qui fonctionne parmi les nombreux sujets sur les forums.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $temps = time();
    $today = date('Y-m-d', $temps);
    Jusque là, je récupère bien la date du jour. Peu importe si je dois modifier le format DATE ou DATETIME de la base de données, du moment que j'ai une date. J'ai essayé les 2 mais à chaque fois, le code bug sur l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = $wpdb->prepare("INSERT INTO `ma_table` (`Nom`,`Date`) values (%s, %s)", $Nom,  $today);
    J'ai essayé str_to_date($today, "%d/%m/%Y") ainsi que plein d'autres formats et fonctions.
    Résultats, je suis à court d'idées.

    Please help me

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Bonjour,

    1 - Date est une clé réservé en db
    2 - Quelle est le type du champs Date en db (Date,DateTime,Timestamp......)
    Avez vous fais un echo de $today ?

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Septembre 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2018
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    1 - Date est une clé réservé en db
    J'ai changé son nom en DateTest au cas où mais toujours pareil

    2 - Quelle est le type du champs Date en db (Date,DateTime,Timestamp......)
    J'ai laissé Date mais aussi testé avec DateTime


    Avez vous fais un echo de $today ?
    QUand je dis que jusque là ça va, ça veut dire que j'ai fait un echo qui donne :
    2018-10-17
    D'où le ($today, "%d/%m/%Y")

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    On peux voir l'erreur ?

    Avec-vous essayer ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $requete = $wpdb->prepare("INSERT INTO `ma_table` (`Nom`,`Date`) values (?, ?)" );
    $requete->execute([ $Nom,  $today]);

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Septembre 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2018
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    On peux voir l'erreur ?
    Déjà vous m'avez fait avancer un peu car je devrais peut-être préciser que j'utilise WP donc va savoir où le code reste bloqué. Je pensais qu'il n'affichait aucune erreur mais en bas de la page sans header ni menu, on peut lire :

    Error thrown

    Call to a member function prepare() on null

    Avec-vous essayer ceci ?
    Même erreur mais j'ai vérifié les 2 données que j'ai laissées ne sont pas vides. C'est un insert de beaucoup plus de valeurs que j'essaie de faire mais rien que ces 2 là, ça ne marche pas.
    Je n'ai pas essayé d'enlever l'autre variable vu que c'est un index. Je suis pas spécialiste mais ça ne me parâit pas une très bonne idée de l'omettre.
    Et la table a bien été créée, je jure.

    DOnc qu'est-ce qu'il peut bien interpréter comme null dans la requête exacte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO constitution (`IDClient`,`DateTest`) values ($IDClient, $today)"
    ??

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    WP , avez vous ajouter la constante suivante dans wp-config.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    define( 'WP_DEBUG', true );
    Histoire que cela affiche les erreurs.

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Septembre 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2018
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Je viens de le faire mais ça n'affiche rien de plus.

    (Au moins je suis rassurée que le problème ne vous saute pas aux yeux non plus)

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    MaitrePylos a donné la bonne solution en utilisant la requête préparée et passer les variables en paramètre de la méthode execute.
    Avec ton code, tu as concaténé directement dans la requête:
    1. Les valeurs qui ne sont pas des entiers devront être dans des guillemets, ce que tu n'as pas fait.
    2. Dans le cas où les valeurs ont des guillemets identiques à ce qui l'entour, tu auras d'erreur.
    3. La requête peut être exposée à une injection sql.

    Adapte le code de MaitrePylos pour ton besoin.

    A+.

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Septembre 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2018
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    1. Les valeurs qui ne sont pas des entiers devront être dans des guillemets, ce que tu n'as pas fait.
    J'ai bien fait un copier/coller pour m'assurer qu'il ne s'agit pas d'un problème de syntaxe. C'est seulement à la 2ème tentative que j'ai enlevé les guillemets au nom de la table pour voir si c'était le problème.
    DOnc cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = $wpdb->prepare("INSERT INTO `constitution` (`IDClient`,`DateTest`) values ($IDClient, $today)" );
    ne fonctionne pas plus.

    Dans le cas où les valeurs ont des guillemets identiques à ce qui l'entour, tu auras d'erreur.
    Il ne me semble pas avoir fermé les guillemets de la requête

    La requête peut être exposée à une injection sql.
    C'est pas ce qu'est censée éviter le $wpdb->prepare() ?

    Si je comprends bien personne ne voit d'avantage que moi l'origine du problème et le define( 'WP_DEBUG', true ); dans le fichier config ne donne pas plus d'informations ?
    Aucune autre idée où je pourrais en savoir d'avantage ?
    Il va bien falloir que j'insère des dates dans ma base de données un jour où l'autre.

    Merci pour votre aide

  10. #10
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Point 1
    Citation Envoyé par K.reen Voir le message
    J'ai bien fait un copier/coller pour m'assurer qu'il ne s'agit pas d'un problème de syntaxe. C'est seulement à la 2ème tentative que j'ai enlevé les guillemets au nom de la table pour voir si c'était le problème.
    DOnc cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = $wpdb->prepare("INSERT INTO `constitution` (`IDClient`,`DateTest`) values ($IDClient, $today)" );
    ne fonctionne pas plus.
    J'ai bien dit valeur, celle que tu vas insérer dans la base.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `constitution` (`IDClient`,`DateTest`) values (12, '2018-10-19 00:00:00')
    Point 2
    Citation Envoyé par K.reen Voir le message
    Il ne me semble pas avoir fermé les guillemets de la requête
    Pour avoir la requête SQL que j'ai donnée, tu auras la tentation d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = $wpdb->prepare("INSERT INTO `constitution` (`IDClient`,`DateTest`) values ('$IDClient', '$today')" );
    Ça fonctionne pour un type date, sauf que si la colonne n'est pas une date mais un varchar, et que la valeur contient un guillemet simple (exemple "L'élève" ), tu auras une requête générée:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `constitution` (`IDClient`,`DateTest`) values (12, 'L'élève')
    tu vois bien que la chaîne est tronqué.

    Point 3
    Citation Envoyé par K.reen Voir le message
    C'est pas ce qu'est censée éviter le $wpdb->prepare() ?
    Si tu l'utilises bien. Imagine si pour la vérification d'un utilisateur et mot de passe avec ta façon de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = $wpdb->prepare("select * from utilisateur where pseudo='$pseudo' and passwd='$passwd'");
    L'utilisateur entre comme pseudo = ps' or 1=1 limit 1 /* et passwd = */--, tu auras une requête générée
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from utilisateur where pseudo='ps' or 1=1 limit 1/*' and passwd='*/-- '
    Ça va retourner un utilisateur trouvé dans la base sans qu'il connaisse un pseudo et mot de passe, l'utilisateur peut se loguer sur ton appli. C'est pour éviter ce genre de chose qu'il ne faut pas concaténer les valeurs dans une requête. Pire si l'utilisateur tente de supprimer une table (pseudo = ps' or 1=1 limit 1; drop table utilisateur; /*). Ça va faire mal


    La bonne façon d'utiliser une requête préparée c'est de ne pas concaténer des variables directement dans la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $requete = $wpdb->prepare("INSERT INTO `constitution` (`IDClient`,`DateTest`) values (?, ?)" );
     $wpdb->execute(array($IDClient,$today));
    Ça devrait résoudre ton problème.

    Pour l'erreur WP, vérifie ce qui se trouve dans wp-content/debug.log, ou affiche sur la page les erreurs define( 'WP_DEBUG_DISPLAY', true);A+.

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Septembre 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2018
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Ca fait beaucoup d'infos.

    Si je comprends bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $requete = $wpdb->prepare("INSERT INTO `Table` (`Col1`,`Col2`) values (?, ?)" );
     $wpdb->execute(array($Col1,$Col2));
    est l'équivalent des anciens contrôles get_magic_quotes_gpc(), stripslashes(trim($string), mysql_real_escape_string($string), addcslashes($string, '%_') ?

    Donc revenons un peu en arrière parce que j'ai eu beau ajouter define( 'WP_DEBUG_DISPLAY', true); dans le wp-config.php, je n'ai pas plus de détails sur ce qu'il se passe.

    Avant d'avoir ce problème d'insertion avec la date du jour, j'ai déjà alimenté une 1ère table avec une date de naissance et tout fonctionnait parfaitement bien avec les instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = $wpdb->prepare("INSERT INTO `Table1` (`Mail`,`Prenom`, `Naissance`) values (%s, %s, %s)", $Mail, $Prenom, $Naissance);
    $wpdb->query($sql);
    Sachant que même si la plupart de mes fonctions de contrôle ne sont plus d'actualités aujourd'hui, j'avais gardé une classe assurant la sécurité des données entrantes minimaliste du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Données entrantes
    	public static function bdd($string)
    	{
    		$string = trim($string);
    		if(ctype_digit($string))	$string = intval($string);
    		else	$string = addcslashes($string, '%_');
     
    		return $string;
    	}
    Maintenant si j'essaie votre méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = $wpdb->prepare("INSERT INTO `Table1` (`Mail`,`Prenom`, `Naissance`) values (?, ?, ?)");
    $wpdb->execute(array($Mail, $Prenom, $Naissance));
    Cette fois, je reçois l'erreur
    Error thrown

    Call to undefined method wpdb::execute()

    Ca me dépasse le progrès
    Mais peut-être qu'il y a un rapport avec l'impossibilité d'alimenter ma 2nde table avec la date du jour.
    A votre avis ?

  12. #12
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Ah, je pensais que tu utilisais PDO parce que c'est dans la rubrique PDO .
    Pour l'insertion, utilise directement insert au lieu de prepare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $Naissance = "1950-01-01";
    $wpdb->insert("Table1",
    array(
    "Mail" =>$Mail,
    "Prenom" => $Prenom,
    "Naissance" =>date("Y-m-d", strtotime($Naissance)) ),
    array("%s", "%s", "%s")
    );
    Sinon, quel est le type de la colonne Naissance dans ta base?

    A+.

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Septembre 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2018
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Ah, je pensais que tu utilisais PDO parce que c'est dans la rubrique PDO
    C'est ce que j'essayais de faire mais je m'y prends mal apparemment. Je ne comprends pas les contrôles ni les appels des fonctions .

    Comme je disais la requête suivante fonctionne très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = $wpdb->prepare("INSERT INTO `Table1` (`Mail`,`Prenom`, `Naissance`) values (%s, %s, %s)", $Mail, $Prenom, $Naissance);
    $wpdb->query($sql);
    La colonne Naissance est de type Date dans la BD tout comme la date du jour dans la 2nde table que je n'arrive pas à remplir.
    Si ça marche avec une table, ça devrait marcher avec toutes.
    Mais la meilleure, c'est que j'ai essayé un insert sans la date. Juste avec l'index de la table et à nouveau, je reçois :

    Error thrown
    Call to a member function prepare() on null

    DOnc le problème ne vient pas de la date.
    Mais pourquoi la requête plus haut fonctionne et celle-là non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = $wpdb->prepare("INSERT INTO `Table2` (`IDClient`) values (%s)", $IDClient);

  14. #14
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Error thrown
    Call to a member function prepare() on null
    Parce que $wpdb est null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    global $wpdb;
    $sql = $wpdb->prepare("INSERT INTO `Table1` (`Mail`,`Prenom`, `Naissance`) values (%s, %s, %s)", $Mail, $Prenom, $Naissance);
    $wpdb->query($sql);
    A+

  15. #15
    Futur Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Septembre 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2018
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Tout simplement .
    Merci infiniment .

    J'espère quand même que ma méthode évite les injonctions évoquées.
    C'était le but d'utiliser PDO même si je ne comprends toujours pas les contrôles effectués.

    Bon dimanche

  16. #16
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Citation Envoyé par K.reen Voir le message
    J'espère quand même que ma méthode évite les injonctions évoquées.
    Oui. Ce qu'il faut éviter c'est de concaténer des variables directement dans la requête.

    A+.

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

Discussions similaires

  1. probleme d'insertion de date dans une table
    Par manplum dans le forum C++Builder
    Réponses: 3
    Dernier message: 23/04/2007, 18h14
  2. [SQL 2005][ASP.net 2]Insertion de date dans une table
    Par skystef dans le forum Accès aux données
    Réponses: 2
    Dernier message: 29/12/2006, 09h26
  3. insertion d'une date dans une table
    Par yousfi.z dans le forum JDBC
    Réponses: 3
    Dernier message: 07/08/2006, 15h32
  4. Insertion d'une date dans une table avec vba
    Par skeut dans le forum Access
    Réponses: 2
    Dernier message: 21/02/2006, 08h54
  5. insertion d'un type date dans une table access
    Par monstour dans le forum ASP
    Réponses: 7
    Dernier message: 18/06/2004, 16h57

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