Bonjour à tous,
Voici ma page sur laquelle je rencontre mon problème :
<a href="http://www.hostingpics.net/viewer.php?id=508510Sanstitre.png"><img src="http://img4.hostingpics.net/thumbs/mini_508510Sanstitre.png" alt="Heberger image" /></a>
Lorsque l'utilisateur clique sur le bouton "ajouter une date", une div s'ajoute contenant 4 input de type "datetime-local" pour informer une date et une horaire.
Lorsqu'il clique sur "enregistrer" cela doit enregistrer la totalité des dates saisies dans la table "seance" de ma base de données dans le champ "dateheure_seance" qui est au format datetime.
Mon souci conciste a la création de cette boucle. J'ai cherché sur internet et trouvé de nombreux cas, mais ils étaient avec un nombre de données a insérer était connu.
Dnas mon cas, cette information est impossible a prévoir, elle varie d'un cas à un autre. Il se peut aussi que des input ne soient pas renseignés : Par exemple si il y a uniquement 3 horaires par jours et non 4.
Voici mon code actuel :
<form class="formhoraires" action="" method="post" enctype="multipart/form-data">
<div id="addInput"></div>
<input class="newseance" type="button" value="Ajouter une date" onClick="add();" />
<input class="newseance" type="submit" value="Enregistrer">
</form>
<?php
while (isset($_POST['date']))
{
//var_dump($_POST['date']);
try
{
$bdd = new PDO('mysql:host=localhost;dbname=medrano2017;charset=utf8', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$reponse = $bdd->query('INSERT INTO seance (id_event, dateheure_seance) VALUES ("'.$donnees['id_event'].'","'.$_POST['date'].'")');
header('Location: ../');
}
?>
function add()
{
var input = addInput.innerHTML
addInput.innerHTML = input + '<input class="mid" type="datetime-local" name="date[]" /><input class="mid" type="datetime-local" name="date[]" /><input class="mid" type="datetime-local" name="date[]" /><input type="datetime-local" name="date[]" /><br />\n';
}
Le soucis est que ce code vérifie uniquement si le tableau $date est null ou non, ce qui ne m'avance pas vraiment à quelque chose... Or, je suis incapable d'allé plus loin puisque j'ai beau cherché, je ne trouve rien...
Merci d'avance à tous pour votre aide !
Dans ta boucle avant d'effectuer l'insertion en base de données, penses à vérifier que la valeur n'est pas vide ou alors tu traites le contenu de la variable avant afin d'en extraire les données vides et au lieu de faire une boucle for
, utilises plutôt la boucle foreach
, par exemple :
foreach ($_POST['date'] as $seance):
if (!empty($seance)):
$bdd->query('INSERT INTO seance (id_event, dateheure_seance) VALUES ("' . $donnees['id_event'] . '","' . $seance . '")');
endif;
endforeach;
Bonjour.
Pour commencer, à priori tu n'as pas peur des injections SQL à priori.
Ensuite, la fonction while
ne sert pas à faire des vérifications, donc si tu veux vérifier que $_POST['date']
existe bien, il te faut le faire avant.
isset
permet de retourner true
ou false
, soit dans la documentation PHP :
Retourne TRUE si var existe et a une valeur autre que NULL. FALSE sinon.
Donc comment veux-tu que le while
fonctionne s'il ne reçoit que true
ou false
?
Il faudrait quand même un minimum regarder la documentation, surtout que vu qu'elle est quand même pas mal traduite, elle n'est donc pas bien compliquée à comprendre.
Bonjour et merci de ta réponse,
C'est exactement ce que j'ai écris dans mon message :
"Le soucis est que ce code vérifie uniquement si le tableau $date est null ou non, ce qui ne m'avance pas vraiment à quelque chose...".
Mon soucis n'est pas la, il est dans l'écriture de la boucle for(). Je ne sais pas comment la structurer sachant que lors de l'insertion dans la base, on se sait pas combien d'éléments il y aura.
Et oui, concernant les injections, une fois que tout fonctionnera je passerai aux requetes préparées.
Pour ma part, la seule boucle que je vois, c'est la boucle while
, je ne vois aucune boucle for
et comme j'ai dit précédemment, ta boucle while
est totalement inutile en l'état.
il est dans l'écriture de la boucle for(). Je ne sais pas comment la structurer sachant que lors de l'insertion dans la base, on se sait pas combien d'éléments il y aura.
Tu pourrais par exemple t'inspirer d'un exemple disponible dans la documentation :
/*
* Ceci est un tableau avec des données que nous voulons modifier au long de la boucle
*/
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
Source : Les structures de contrôle » for.
J'avais en effet deja essayé quelque chose avec cet exemple mais ça s'était avéré par un echec.
Voici le code que je viens de refaire, on pourra peut être approfondir :
<?php
$seance = array($_POST['date']);
for($i = 0; $i < count($seance); ++$i)
{
try
{
$bdd = new PDO('mysql:host=localhost;dbname=medrano2017;charset=utf8', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$reponse = $bdd->query('INSERT INTO seance (id_event, dateheure_seance) VALUES ("'.$donnees['id_event'].'","'.$seance[$i].'")');
}
?>
Cela me génére cette eeruer :
Notice: Undefined index: date in C:\wamp\www\Medrano2017\Admin\Event\GererHoraires\index.php on line 75
La ligne 75 étant celle de la déclaration du tableau :
$seance = array($_POST['date']);
As-tu pensé de vérifier que l'index existe avant d'affecter ta variable ?
<?php
if (isset($_POST['date']))
{
$seance = array($_POST['date']);
for($i = 0; $i < count($seance); ++$i)
{
try
{
$bdd = new PDO('mysql:host=localhost;dbname=medrano2017;charset=utf8', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$reponse = $bdd->query('INSERT INTO seance (id_event, dateheure_seance) VALUES ("'.$donnees['id_event'].'","'.$seance[$i].'")');
}
}
?>
C'est quoi exactement le problème que tu rencontre ? Tu te retrouves avec des enregistrements vide sur la colonne 'dateheure_seance'?
Personnellement je verrai deux problèmes, le premier dans ton for tu ne verifie pas si ta valeur n'est pas un string vide, la deuxième ne cause pas de problème mais pourquoi faire ta connexion a la bdd dans ton for en reinstanciant à chaque fois pdo?
Bonjour et merci de vos messages.
Voici mon code modifié aprés vos conseils :
<?php
if (isset($_POST['date']))
{
try
{
$bdd = new PDO('mysql:host=localhost;dbname=medrano2017;charset=utf8', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$seance = array($_POST['date']);
for($i = 0; $i < count($seance); ++$i)
{
$reponse = $bdd->query('INSERT INTO seance (id_event, dateheure_seance) VALUES ("'.$donnees['id_event'].'","'.$seance[$i].'")');
}
}
?>
Voici à présent l'erreur :
Notice: Array to string conversion in C:\wamp\www\Medrano2017\Admin\Event\GererHoraires\index.php on line 89
Sachant que la ligne 89 correspond à la ligne de ma requete SQL.
Alors la ligne 89 est celle-là :
$reponse = $bdd->query('INSERT INTO seance (id_event, dateheure_seance) VALUES ("'.$donnees['id_event'].'","'.$seance[$i].'")');
J'ai mis en commentaire ma boucle for et mis un var_dump($seance); et voici le résultat :
array (size=1)
0 =>
array (size=4)
0 => string '1922-02-15T17:00' (length=16)
1 => string '2017-04-05T09:52' (length=16)
2 => string '' (length=0)
3 => string '' (length=0)
J'avais rentré 2 dates sur les 4 : Le 15/02/1922 a 17h00 et le 05/04/2017 à 09h52.
Sauf le format des dates, les infos sont bonnes.
En fait je fais $donnees['id_event'] parce que plus haut dans ma page je récupére l'id de l'événement sélectionné sur la page précédente comme ceci :
if( isset( $_GET['id'] ) ) {
$requete = $bdd->prepare('SELECT * FROM evenement WHERE id_event = ?');
$requete->execute( array( intval($_GET['id']) ) );
$donnees = $requete->fetch();
$requete->closeCursor();
}
J'ai quand même essayé ta solution et ça m'a affiché 2 erreurs correspondantes à la ligne de ma requête :
Warning: Illegal string offset 'id_event' in C:\wamp\www\Medrano2017\Admin\Event\GererHoraires\index.php on line 92
Notice: Array to string conversion in C:\wamp\www\Medrano2017\Admin\Event\GererHoraires\index.php on line 92
Ah d'accord je comprends mieux !
Alors j'ai modifié le code, il n'y a plus de message d'erreur et l'insertion ce fait ! Un bon soucis de résolu grace à toi ;)
Cependant, juste une seule date s'insère. Par exemple j'ai saisi cela :
<a href="http://www.hostingpics.net/viewer.php?id=596700Sanstitre.png"><img src="http://img4.hostingpics.net/thumbs/mini_596700Sanstitre.png" alt="Heberger image" /></a>
Et voici le résultat dans ma base de données :
<a href="http://www.hostingpics.net/viewer.php?id=565145Sanstitre.png"><img src="http://img4.hostingpics.net/thumbs/mini_565145Sanstitre.png" alt="Heberger image" /></a>
L'insertion ne s'effectue plus avec cette modification.
En essayant de modifier ma requete en conséquance comme ça :
$reponse = $bdd->query('INSERT INTO seance (id_event, dateheure_seance) VALUES ("'.$donnees['id_event'].'","'.$seance[$i].'")');
L'insertion ne se fait plus non plus.
Bonjour,
Aprés avoir saisi 2 dates sur les 4 affichées :
array (size=4)
0 => string '1992-02-15T15:00' (length=16)
1 => string '1635-05-17T18:02' (length=16)
2 => string '' (length=0)
3 => string '' (length=0)
Oui en effet j'avais totalement oublié de faire ça pour pas qu'il insére des données vierges, merci !
Cependant mon problème perciste, il enregistre seulement la première date saisie.
J'ai mis mon var_dump dans mon if, et les données saisies sont bien dans la variable $seance.
Non en fait il n'y a qu'un seul enregistrement par événement qui se fait dans ma base...
hello,
le code de @Lartak est bon... une question se pose alors :
ton champ 'id_event' n'est pas une clé j'espère ? ;)
<a href="http://www.hostingpics.net/viewer.php?id=760691Sanstitre.png"><img src="http://img4.hostingpics.net/thumbs/mini_760691Sanstitre.png" alt="Heberger image" /></a>
....
re, c bien ce que je pensais ;) c une clé... tu ne peux l'écraser.
modifie la structure de ta table...
sorry, je suis un peu paumé...
si g bien compris lors de ton insert tu veux mettre 2 tables en relation : lesquelles ?
je n'arrive pas à comprendre si c seance ou event qui fait relation...
(de toutes façons la table que tu nous montres est mal structurée...)
Alors voila le principe de mon espace admin : Je dois créer différentes tournées. Ces tournées comportes différents événements. Et ces événements sont étalés sur plusieurs séances.
J'en suis a la dernière étape : Créér les séances en les ajoutant a un événement. Le reste est fait.
J'arrive donc sur cette page qui affiche tous les événements présents dans la BDD :
<a href="http://www.hostingpics.net/viewer.php?id=654356Sanstitre.png"><img src="http://img4.hostingpics.net/thumbs/mini_654356Sanstitre.png" alt="Heberger image" /></a>
Lorsque je clique sur l'horloge, j'ajoute ces fameuses horaires. La récupération de l'id de l'événement auquel on va ajouter ces horaires ce fait par url.
Ce sont donc les tables "evenement" et "seance" qui sont en relations.
Voici ma table "evenement" :
<a href="http://www.hostingpics.net/viewer.php?id=425675Sanstitre.png"><img src="http://img4.hostingpics.net/thumbs/mini_425675Sanstitre.png" alt="Heberger image" /></a>
Depuis que tu m'as dis ça, j'ai supprimé ma table "seance" en attendant...
Je suis pas un expert en bdd,donc ne pas prendre ce que je dis comme quelque chose de sur, mais le fait que id_event soit une clé primaire ça pose pas de problème d'avoir plusieurs fois le même id dans les enregistrements ?
Bonjour et merci pour votre aide !
Alors avant de tester ton code Blobby, je dois régler un nouveau problème... En effet, hier ma table était apparement mauvaise, je l'ai donc supprimée. Ce matin je l'ai de nouveau créée, mais depuis, plus rien de s'insère dedans...
La voici :
<a href="http://www.hostingpics.net/viewer.php?id=290448Sanstitre.png"><img src="http://img4.hostingpics.net/thumbs/mini_290448Sanstitre.png" alt="Heberger image" /></a>
Et voici ma schéma relationnel :
<a href="http://www.hostingpics.net/viewer.php?id=969023Sanstitre.png"><img src="http://img4.hostingpics.net/thumbs/mini_969023Sanstitre.png" alt="Heberger image" /></a>
Ok c'est bon, je viens de régler ce soucis. Par contre même avec ce code, une seule insertion s'effectue... Je suis perdu aussi !
Et voici le resultat du var_dump aprés la saisir de 3 séances :
C:\wamp\www\Medrano2017\Admin\Event\GererHoraires\index.php:98:string '(35, 1992-02-15T11:42), (35, 1015-01-02T11:42), (35, 1992-02-15T18:18)' (length=70)
Bon alors a ne rien comprendre maintenant ça fonctionne.... Je suis retourné sur l'ancien code donc voici la totalité de ma page :
<?php
session_start();
if (!$_SESSION['pseudo']) {
header('Location: index.php');
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="fr">
<head>
</head>
<body>
<?php
if( isset( $_GET['id'] ) ) {
try {
$bdd = new PDO('mysql:host=localhost;dbname=medrano2017;charset=utf8', 'root', '');
}
catch(Exception $e) {
die('Erreur : '.$e->getMessage());
}
$requete = $bdd->prepare('SELECT * FROM evenement WHERE id_event = ?');
$requete->execute( array( intval($_GET['id']) ) );
$donnees = $requete->fetch();
$requete->closeCursor();
$id=$donnees['id_event'];
//var_dump($id);
}
else
{
}
?>
<h1 class="titrepageadmin">Horaires de l'événement <?php echo $donnees['ville_event'];?> de la tournée <?php echo $donnees['id_tournee'];?></h1>
<form class="formhoraires" action="" method="post" enctype="multipart/form-data">
<div id="addInput"></div>
<input class="newseance" type="button" value="Ajouter une date" onClick="add();" />
<input class="newseance" type="submit" value="Enregistrer">
</form>
<?php
if (isset($_POST['date']))
{
try
{
$bdd = new PDO('mysql:host=localhost;dbname=medrano2017;charset=utf8', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$seance = $_POST['date'];
foreach ($_POST['date'] as $seance):
if (!empty($seance)):
var_dump($seance);
$bdd->query('INSERT INTO seance (id_event, dateheure_seance) VALUES ("' . $donnees['id_event'] . '","' . $seance . '")');
endif;
endforeach;
}
?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">
function add()
{
var all = addInput.getElementsByTagName('input');
for (let chaqueInput of all){
chaqueInput.defaultValue = chaqueInput.value;
}
addInput.innerHTML += '<input class="mid" type="datetime-local" name="date[]" value="2014-01-02T11:42" />';
}
</script>
</body>
</html>