Verifica inserimento dati form

DieciJack

Nuovo Utente
22 Feb 2015
13
0
0
Salve a tutti ragazzi, ho un problema con un form che utilizzo per l'inserimento dei dati nel database, ecco il codice:

PHP:
<?php

  // CONNESSIONE DATABASE
 include ("../config/config.php");
 
 // MAGIC QUOTES OFF
 include ("mag-quot.php");

 $autore_articolo = $_POST['autore_articolo'];
 $titolo_articolo = $_POST['titolo_articolo']; 
 $testo_articolo =  $_POST['testo_articolo'];
 
if (isset($autore_articolo, $titolo_articolo, $testo_articolo))
{
	$sql = 'INSERT INTO articoli SET 
	 autore_articolo = :autore_articolo,
	 titolo_articolo = :titolo_articolo,
	 testo_articolo = :testo_articolo,
	 data_articolo = CURDATE()';
	
	 $s = $pdo->prepare($sql);
	 $s->bindValue(':autore_articolo', $autore_articolo);
	 $s->bindValue(':titolo_articolo', $titolo_articolo);
	 $s->bindValue(':testo_articolo', $testo_articolo);
	 $s->execute();
}

header('Location: .');
exit();
?>

Lo script funziona e non riscontro alcun problema, ma se nel form HTML lascio uno o più campi vuoti la query viene eseguita comunque. Quello che mi chiedo è come annullare l'invio del form se uno o più campi non sono stati compilati (suppongo con else). In più ho un altro dubbio con questi parametri:

PHP:
if (isset($autore_articolo, $titolo_articolo, $testo_articolo))
Qui posso inserire direttamente $_POST['submit'] oppure ho bisogno di inserire tutti i campi come ho fatto nel codice?

Un altro dubbio riguarda la data:

PHP:
data_articolo = CURDATE();

Nella pagina index.php l'ordine di visualizzazione dipende da ORDER BY `data_articolo` DESC'.
Quando inserisco un nuovo articolo tramite form l'ultimo che ho inserito non viene visualizzato per primo ma viene ordinato sotto quelli che ho inserito precedentemente nella stessa giornata. Se utilizzassi NOW() al posto di CUREDATE() potrei risolvere il problema? Il campo data_articolo però è appunto utilizzato per la data e non è previsto l'orario, dovrei creare un nuovo campo per la data o posso utilizzare data_articolo? Grazie in anticipo.
 
ciao
questo per evitare che uno dei campi sia vuoto
PHP:
<?php
//....
$autore_articolo = trim($_POST['autore_articolo']);// con trim elimini spazi prima e dopo
$titolo_articolo = trim($_POST['titolo_articolo']); //e eviti che sia un solo spazio
$testo_articolo =  trim($_POST['testo_articolo']);
if($autore_articolo=="" || $titolo_articolo=="" || $testo_articolo==""){
	echo "tutti i campi vanno reimpiti";
	//e rimandi dove vuoi
}else{
	//fai l'insert ecc
}
//....
?>
poi la differenza tra curdate e now è come ti restiutisce la data es.
curdate => 2015-03-04
now => 2015-03-04 11:09:33
quindi forse now è meglio perche usa anche ora minuti secondi quindi distingue tra due inserite nella stessa giornata
 
Grazie per i suggerimenti adesso il codice funziona ma purtroppo ho ancora due piccoli problemi:

Se il form ha uno o più campi non compilati la query non viene eseguita ma l'echo all'interno di if non viene mostrato, sarà perchè non ho aggiunto un header all'interno? In più la funzione NOW() presenta lo stesso problema di CURDATE():

http://gyazo.com/2266087b48c5689a4281fe90597f628f

NOW(2) è stato inserito per ultimo, è possibile che il problema sia causato dalla funzione DESC della query nell'index?

Questo è il codice aggiornato:

PHP:
<?php

  // CONNESSIONE DATABASE
 include ("../config/config.php");
 
 // MAGIC QUOTES OFF
 include ("mag-quot.php");

 $autore_articolo = trim($_POST['autore_articolo']);
 $titolo_articolo = trim($_POST['titolo_articolo']); 
 $testo_articolo =  trim($_POST['testo_articolo']);
 
if ($autore_articolo=="" || $titolo_articolo=="" || $testo_articolo=="")
{
	echo "Tutti i campi devono essere compilati.";
} 
 else 
{
	$sql = 'INSERT INTO articoli SET 
	 autore_articolo = :autore_articolo,
	 titolo_articolo = :titolo_articolo,
	 testo_articolo = :testo_articolo,
	 data_articolo = NOW()';
	
	 $s = $pdo->prepare($sql);
	 $s->bindValue(':autore_articolo', $autore_articolo);
	 $s->bindValue(':titolo_articolo', $titolo_articolo);
	 $s->bindValue(':testo_articolo', $testo_articolo);
	 $s->execute();
}

header('Location: .');
exit();
?>
 
Ciao, l'echo non la vedi perchè reindirizzi al form, se metti un time di 5 secondi alla funzione header() dovresti vederlo
Modifica il tipo campo data_articolo in TIMESTAMP o DATETIME direttamente da phpmyadmin
 
Grazie mille, aggiungendo un refresh ho risolto il problema dell'echo, in più ho modificato il campo di data_articolo e l'ordine degli articoli è correto.
Mi chiedevo se fosse possibile modificare il formato dell'ora: adesso la visualizzo normalmente in questo modo: Data: 2015-03-10 21:24:12 vorrei poterla visualizzare racchiusa fra parentesi tonde con il corsivo: Data: 2015-03-10 (21:24:12).

Attualmente utilizzo questa variabile per formattare la data nel formato europeo:

PHP:
$data = preg_replace('/^(.{4})-(.{2})-(.{2})$/','$3-$2-$1', $data);

Devo agire su questa?
 
Ultima modifica:
Io farei in questo modo
PHP:
<?php

$data = "2015-03-10 21:24:12";

$split = explode(" ", $data);

echo str_replace("-", "/", $split[0]) . " (" . $split[1] . ")";
giusto perchè le regex non le ho mai digerite :evil:
 
Grazie per l'aiuto adesso l'ora è racchiusa fra parentesi.
So che sto facendo un milione di domande ma purtroppo sono un neofita di PHP :)
C'è un modo per visualizzare solamente le ore ed i minuti escludendo i secondi nel risultato della query?
Ho provato ad applicare un replace a $split[1] ma senza risultati.
 
ciao
io uso sempre il timestamp, soprattutto per insereire la data nel db, da cui poi si può formattare la data come si vuole
esempi:
PHP:
<?php
$time_stamp=time();//data espressa in timestamp
echo "$time_stamp <br>";//output 1426148555
echo date("d-m-Y H:i:s",$time_stamp)."<br>";//output 12-03-2015 09:22:35
//uso di backslash per inserire altri caraterri
echo date("d-m-Y \(H:i:s\)",$time_stamp)."<br>";//output 12-03-2015 (09:22:35)
echo date("d/m/Y H\h i\m s\s",$time_stamp)."<br>";//output 12/03/2015 09h 25m 45s
?>
 
Ultima modifica:
In questo preciso caso mi consigliate l'utilizzo di TIMESTAMP oppure di DATETIME? Ho provato con
PHP:
$split[1] = substr($split[1], 0, -3);
e adesso funziona tutto correttamente. Ho provato anche con time() ma ho avuto problemi nello script del form.
 
ciao
forse perche non hai settato bene il campo data_articolo
PHP:
<?php
//.....
 else 
{
	$sql = 'INSERT INTO articoli SET 
     autore_articolo = :autore_articolo,
     titolo_articolo = :titolo_articolo,
     testo_articolo = :testo_articolo,
     data_articolo ='.time();//e il campo data_articolo lo setto a int(12)
    //con time() ottieni la data attuale espressa in timestamp
     $s = $pdo->prepare($sql);
     $s->bindValue(':autore_articolo', $autore_articolo);
     $s->bindValue(':titolo_articolo', $titolo_articolo);
     $s->bindValue(':testo_articolo', $testo_articolo);
     $s->execute();
}
//....
?>
una volta che hai il timestamp poi lo stampi nella forma/e che preferisci come ti ho fatto gli eesempi
 

Discussioni simili