2
votes

Comment définir la date dans mysql sur null et non sur 0000-00-00

 entrez la description de l'image ici Je viens de terminer un système de connexion et j'ai ajouté un autre tableau pour les informations personnelles des utilisateurs. Pour cette raison, j'ai quelques entrées qui ne sont pas nécessaires. Les champs de texte ne posent aucun problème mais il y a un problème avec les champs de date et de nombre: Puisque l'utilisateur n'est pas obligé de donner tous les champs d'information qui ne sont pas remplis, ils doivent être NULL. Mais en cas de date, il me donne toujours 0000-00-00 à la place et en cas de numéro, c'est toujours 0.

Je vous donne tout le code car je ne suis pas sûr de ce qui est le plus important mais je pense que sa ligne 9 , 10, 14-21, 73, 76

<?php

  $user_id = $_GET['id'];

  if(isset($_POST['add-personal-data'])){
    $geschlecht = $_POST['geschlecht'];
    $vorname = $_POST['vorname'];
    $nachname = $_POST['nachname'];
    $alter = $_POST['alter'];
    $input_date = $_POST['geburtsdatum'];
    $lieblingsziel = $_POST['lieblingsziel'];
    $beschreibung = $_POST['beschreibung'];

    if($input_date != null){
      $geburtsdatum = date("Y-m-d H:i:s",strtotime($input_date));
    } else {
      $geburtsdatum = NULL;
    }

    $beschreibung_statement = $pdo->prepare("INSERT INTO beschreibung (user_id, name, vorname, geschlecht, user_alter, geburtsdatum, lieblingsziel, beschreibung)
                                            VALUES ('$user_id', '$nachname', '$vorname', '$geschlecht', '$alter', '$geburtsdatum', '$lieblingsziel', '$beschreibung')");

    $user_control_statement = $pdo->prepare("SELECT * FROM user WHERE user_id = '$user_id'");
    $user_control_statement->execute();
    $user = $user_control_statement->fetch();

    if($user != NULL){

        $user_has_description_statement = $pdo->prepare("SELECT * FROM beschreibung WHERE user_id = '$user_id'");
        $user_has_description_statement->execute();
        $description = $user_has_description_statement->fetch();

        if($description == NULL){
          $beschreibung_statement->execute();
        } else {
          echo ('<div class="line fehler"><p> Dieser Benutzer besitzt bereits eine Beschreibung. </p></div>');
        }

    } else {
      echo ('<div class="line fehler"><p> Dieser Benutzer existiert nicht. </p></div>');
    }
  }

    echo $geschlecht . "<br>" . $vorname . "<br>" . $nachname . "<br>" . $alter . "<br>" . $geburtsdatum . "<br>" . $lieblingsziel . "<br>" . $beschreibung ;

?>
<main>
  <div class="line">

    <div class="register">

      <form method="post" action="?p=add-personal-data&id=<?php echo $user_id; ?>">

        <h2>Persönliche Daten</h2>
        <hr />
        <p>Daten, die du hier angibst, werden auf deinem Profil angezeigt.</p>

        <h4>Geschlecht</h4>
        <select name="geschlecht" class="datafield">
          <option>männlich</option>
          <option>weiblich</option>
          <option>anderes</option>
          <option selected>keine Angabe</option>
        </select>

        <h4>Vorname</h4>
        <input type="text" name="vorname" placeholder="Vorname" class="datafield" value="">

        <h4>Nachname</h4>
        <input type="text" name="nachname" placeholder="Nachname" class="datafield" value="">

        <h4>Alter</h4>
        <input type="number" name="alter" placeholder="Alter" class="datafield" value="">

        <h4>Geburtsdatum</h4>
        <input type="date" name="geburtsdatum" placeholder="Geburtsdatum" class="datafield" value="">

        <h4>Lieblingsziel</h4>
        <input type="text" name="lieblingsziel" placeholder="Lieblingsziel" class="datafield" value="">

        <h4>Beschreibung</h4>
        <textarea name="beschreibung" wrap="soft" class="datafield" rows="5" placeholder="Gib hier persönliche information, wie zum Beispiel Hobbies an."></textarea>

        <div>
          <input type="submit" name="add-personal-data" value="Speichern" class="submitbutton">
        </div>

      </form>
    </div>

  </div>
</main>

Comment puis-je définir NULL sur "geburtsdatum" et "user_alter" si l'utilisateur ne donne aucune information? p>


5 commentaires

Définissez DEFAULT NULL puis insérez NULL


Pour expliquer ce que signifie @ZainFarooq, vous devez changer la propriété de cette colonne en DEFAULT NULL , puis mettre votre valeur comme null


@ window.document Oui, mais nous pouvons également attribuer NULL sans définir la valeur par défaut sur null, mais si vous n'êtes même pas autorisé à entrer une valeur nulle, vous devez définir allow null


Si le type de données est défini sur date, il ne prendra jamais NULL comme valeur. Si vous voulez que la date soit nulle, changez le type de données en varchar. Et lors de la lecture de la date de la base de données, vous devez taper cast le VARCHAR en DATE


Il est bon que vous utilisiez PDO, mais vous devriez utiliser des espaces réservés dans votre requête au lieu d'interpoler les valeurs. Sinon, vous êtes toujours vulnérable à l'injection SQL.


4 Réponses :


2
votes

Définissez la valeur par défaut sur NULL ou vous pouvez simplement insérer la valeur NULL si l'utilisateur ne donne aucune information. De plus, si vous définissez DEFAULT sur NULL , vous n'avez même pas besoin de lui attribuer une valeur. Il l'attribuera automatiquement NULL
Vous pouvez ajouter une requête d'insertion pour NULL simplement comme ceci

INSERT INTO beschreibung (geburtsdatum, user_alter, ...) VALUES (NULL,NULL,...);

Pourtant, si vous rencontrez des problèmes, vous devez y aller à phpmyadmin et rendez-le nul en cochant cette case

entrez la description de l'image ici

Mettre à jour

Comme Mangesh Sathe l'a défini dans la section des commentaires, vous devez changer le type en DATETIME ou TIMESTAMP au lieu de date


2 commentaires

J'ai ce crochet mais ça ne marche toujours pas. INSERT INTO beschreibung (geburtsdatum, user_alter, ...) VALUES (NULL, NULL, ...); n'est pas possible car alors il n'y a rien d'inséré si l'utilisateur tape quelque chose.


Comme Mangesh l'a défini, vous devez changer le Type en DATETIME ou TIMESTAMP au lieu de date



0
votes

Tout d'abord, définissez la valeur par défaut de la colonne geburtsdatum NULL dans votre base de données. Maintenant, je pense que ce serait mieux si vous utilisez 2 chaînes de requête ou les deux if et else pour geburtsdatum. Si la date est nulle, ne l'insérez pas dans la requête.

Comme:

$insert_query = '';
if($input_date != null){
  $geburtsdatum = date("Y-m-d H:i:s",strtotime($input_date));
  $insert_query = "INSERT INTO beschreibung (user_id, name, vorname, geschlecht, user_alter, geburtsdatum, lieblingsziel, beschreibung)
                                        VALUES ('$user_id', '$nachname', '$vorname', '$geschlecht', '$alter', '$geburtsdatum', '$lieblingsziel', '$beschreibung')";
} else {
  // there is no geburtsdatum in the query.
  $insert_query = "INSERT INTO beschreibung (user_id, name, vorname, geschlecht, user_alter, lieblingsziel, beschreibung)
                                        VALUES ('$user_id', '$nachname', '$vorname', '$geschlecht', '$alter', '$lieblingsziel', '$beschreibung')"
}
$beschreibung_statement = $pdo->prepare($insert_query);

 entrez la description de l'image ici


1 commentaires

C'est la seule solution pour la colonne de type de date



0
votes

Ceci est une solution en dehors de la préparation:

Vous définissez soit $ geburtsdatum sur la chaîne NULL , soit sur la date entre guillemets (pas seulement échappée). p >

VALUES ( ..., '$alter', $geburtsdatum, '$lieblingsziel', ... )

Ensuite, dans la partie VALUES (), vous l'écrivez sans guillemets:

if( $input_date != null ){
    $geburtsdatum = '"'.date("Y-m-d H:i:s",strtotime($input_date)).'"';
} else {
    $geburtsdatum = "NULL";
}


0 commentaires

0
votes

Si votre colonne geburtsdatum est déjà définie pour accepter les valeurs NULL et que Default est défini sur NULL, vous devez à la place séparer l'instruction db en 2.

$geburtsdatum = date("Y-m-d H:i:s",strtotime($input_date));

if($input_date != null){
  $beschreibung_statement = $pdo->prepare("INSERT INTO beschreibung (user_id, name, vorname, geschlecht, user_alter, geburtsdatum, lieblingsziel, beschreibung)
                                        VALUES ('$user_id', '$nachname', '$vorname', '$geschlecht', '$alter', '$geburtsdatum', '$lieblingsziel', '$beschreibung')");

} else {
  //this statement will assign NULL into geburtsdatum field
  $beschreibung_statement = $pdo->prepare("INSERT INTO beschreibung (user_id, name, vorname, geschlecht, user_alter, lieblingsziel, beschreibung)
                                        VALUES ('$user_id', '$nachname', '$vorname', '$geschlecht', '$alter', '$lieblingsziel', '$beschreibung')");
}


0 commentaires