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>
4 Réponses :
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
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
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
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);
C'est la seule solution pour la colonne de type de date
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";
}
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')");
}
Définissez
DEFAULT NULLpuis insérezNULLPour 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
NULLsans 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 nullSi 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.