Query di inserimento dati nel Database
Query di inserimento dati nel Database postato il 04/09/2012 18:44:38 nel forum programmazione, open source e hosting e modificato da raccoon il 04/09/2012 19:45:02
Premetto come al solito che non sono una programmatrice e gran parte delle cose che seguono sono frutto di intuizioni (spesso sbagliate) e potrebbero essere degli orrori per chi di programmazione se ne intende xD
Dunque, sto cercando di inserire nella scheda dei personaggi un riquadro visibile solo a Master e Admin, in cui sono scritte alcune note che saranno proprio i Master e gli Admin ad inserire, e non saranno modificabili dall'utente.
Il tutto sarebbe strutturato con un form contenente una textarea all'interno della quale rendere sempre visibile il contenuto delle note, ed un pulsante 'submit' con cui inviare al Database le note stesse.
Vorrei che fosse possibile in questo modo integrarne il contenuto di volta in volta, e non solo sostituirlo.
I problemi sono tre:
1) La query non invia il contenuto della variabile al database (ho controllato il funzionamento del form, provando ad inviare una parola, invece di una variabile, e funziona, per cui immagino che il problema sia proprio nella variabile, probabilmente impostata male(?)
2) Una volta che la query ha inviato i dati alla cella del Database, il contenuto della cella resta invariato anche inviando cose diverse (o comunque non viene integrato ma cancellato)
3) Vorrei che all'interno della textarea apparissero proprio le note, in modo da poterle leggere ed eventualmente poterle reinviare con qualche aggiunta, ma per qualche motivo non riesco ad inserirvi la variabile.
Questo è il mio -sicuramente sbagliatissimo- tentativo di query di inserimento dati nel database, con tanto di variabile $Esterno che è la cella in cui andranno le note nel database.
<?
{
$Esterno = $_POST['Esterno'];
$Esterno1 = addslashes($Esterno);
$MySql = "UPDATE Personaggio SET Esterno = '".$Esterno1."' WHERE Nome = '$pg'";
mysql_query($MySql);
}
$ris = mysql_query($MySql) or die( "Errore nella query. Query non eseguita");
if ($ris==TRUE)
{
$conferma="Note Fato aggiornate";
$titolo="Note Fato aggiornate!";
}
else
{
$conferma="Qualcosa, nella registrazione dei dati, è andato storto.";
$titolo="Registrazione dei dati NON avvenuta.";
} ?>
Questo invece è il form di inserimento (è un if perchè l'ho posto in aggiunta ad un'altra parte di codice dedicata all'Esilio, la quale era sempre visibile solo da Master e Admin):
if ( ($_SESSION['Admin_S']==1)||($_SESSION['Master_S']==1)||($_SESSION['Master_S']==2)) {
echo '<form onSubmit="return Conferma();" action="scheda1prova.php" method=Post><tr><td>
NOTE FATO <textarea cols=47 rows=15 name="Note_Fato">qui vorrei che si visualizzassero le note</textarea>
<input Name="Esterno" type=submit value="Aggiungi Note" style={color:white;background:red}></form></td></tr>';
}
?>
04/09/2012 19:46:08 e modificato da eldiabolo il 04/09/2012 19:53:53
Ciao,
mi rifaccio direttamente al codice che hai riportato. Intanto mi permetto di suggerirti di utilizzare per nomi variabili e nomi delle tabelle database sempre caratteri minuscoli dato che potrebbero in alcuni casi darti problemi in base al linguaggio che usi, al server dove gira il codice, alle impostazioni del database e come questo è configurato ecc ecc.. per non sbagliarsi mai solitamente è più comodo scrivere sempre tutto minuscolo in modo da evitare errori con eventuali case-sensitive. Questo è un consiglio mio personale dato dalla mia esperienza di scrittura codici in linguaggi diversi, è ovviamente molto soggettivo ma ritengo sia un buon modo e una buona abitudine, chi usa sistemi unix/linux poi sa bene che a volte è quasi vitale.
Riguardo il codice, nel primo pezzo che riporti:
<?
{
$Esterno = $_POST['Esterno'];
$Esterno1 = addslashes($Esterno);
$MySql = "UPDATE Personaggio SET Esterno = '".$Esterno1."' WHERE Nome = '$pg'";
mysql_query($MySql);
}
Vedo aperta e chiusa parentesi graffa, ma non capisco perché, non so se è stato un errore nel riportare il codice quindi un semplice errore di copia incolla e ti è saltata una parte forse. Se non ti da errore di sintassi il php ad ogni modo presumo sia un semplice errore di copia incolla.
In relazione a quest'altro codice:
if ( ($_SESSION['Admin_S']==1)||($_SESSION['Master_S']==1)||($_SESSION['Master_S']==2)) {
echo '
<form onSubmit="return Conferma();" action="scheda1prova.php" method=Post>
<tr>
<td>
NOTE FATO
<textarea cols=47 rows=15 name="note_fato">qui vorrei che si visualizzassero le note</textarea>
<input Name="Esterno" type=submit value="Aggiungi Note" style={color:white;background:red}>
</form></td></tr>';
}
Hai un oggetto del form dove mettere i dati che si chiama "Note_Fato" che è la text area, sopra invece recuperi il valore del $_POST che si chiama Esterno che è il pulsante di conferma del form html quindi non puoi in alcun modo intercettare i dati immessi.
Prova quindi a fare queste piccole modifiche:
//controlli se è stato inviato il post di nome 'esterno'
//quindi se è stata inviata l'operazione di invio dati.
if (isset($_POST['esterno'])){
//prendi il post della text area chiamata note_fato e gli
//aggiungi direttamente gli slash per filtrare l'input dati
$note_fato= addslashes($_POST['note_fato']);
$query_update = "UPDATE Personaggio SET Esterno = '".$note_fato."' WHERE Nome = '".$pg."' ";
$result_update = mysql_query($query_update ) or die ("errore critico nella query di salvataggio dati");
//controllo operazione effettuata
if ($result_update==TRUE){
$conferma="Note Fato aggiornate";
$titolo="Note Fato aggiornate!";
}else {
$conferma="Qualcosa, nella registrazione dei dati, è andato storto.";
$titolo="Registrazione dei dati NON avvenuta.";
}
}
//controlli i permessi, visualizzazione dati e form
if ( ($_SESSION['Admin_S']==1)||($_SESSION['Master_S']==1)||($_SESSION['Master_S']==2)) {
//carichi i dati, così se sono stati appena modificati
//dall'operazione precedente vengono caricati già aggiornati
$query_load = "SELECT personaggio.esterno FROM personaggio WHERE Nome = '".$pg."' ";
$result_load=mysql_query($query_load) or die("errore caricamento dati");
//controlli se sono stati trovati dati quindi
//se il result è maggiore di 0 righe caricate
if (mysql_num_row($result_load) > 0) {
//passi i dati all'array, io utilizzo questo metodo non è
//obbligatorio ma mi trovo più comodo ed è più leggibile poi il codice
$array_load=mysql_fetch_array($result_load);
$note_fato=$array_load['esterno'];
}else{
//dichiari e iniziliazzi in ogni casi i dati della variabile
//delle note del fato, se ci sono li carichi altrimenti la dichiari vuota.
$note_fato="";
}
//stampi a video la text area e ci metti la stampa unita della
//variabile caricata in precedenza "$note_fato" tra i tag della
//text area così ti riporta i dati che avevi sul database
echo '
<form onSubmit="return Conferma();" action="scheda1prova.php" method=Post>
<tr><td>
NOTE FATO
<textarea cols=47 rows=15 name="Note_Fato">'.$note_fato.'</textarea>
<input Name="esterno" type=submit value="Aggiungi Note" style={color:white;background:red}>
</td></tr>
</form>';
}
Prova così e facci risapere
Editato per sistemare i commenti php nel codice che sballavano la pagina del sito perchè troppo lunghi e aggiunto controllo risultato della "$result_update".
04/09/2012 20:35:16
Innanzitutto grazie mille per la risposta! Sei stato veramente chiaro anche se immagino che per imparare per bene dovrò starci su un bel po' di tempo a rileggere.
Ho provato ad inserire le modifiche che mi hai indicato (eliminando anche le due parentesi graffe prive di utilità che probabilmente erano un residuo del lavoro che sto ingenuamente portando avanti) ma mi viene fuori "errore caricamento dati" ..
05/09/2012 00:01:00
Di nulla figurati, fa piacere aiutare quando si può dato che a suo tempo devo sicuramente anche io ringraziare chi rispondeva nei vari forum mentre cercavo di capire e di imparare cose nuove. Ci si da volentieri una mano quando si può. Se ti serve qualche altra spiegazione più dettagliata in quello che ho scritto chiedi pure vedo di chiarirti qualche punto se qualcosa magari l'ho data per scontata, nessun problema, con un po' di tempo si fa tutto.
Ti faccio una domanda a questo punto, stai usando immagino un CMS, mi dici qual'è così per rendermi conto?
Allora in fase di testing è necessario in questi casi aumentare l'output errori il più possibile per capire dove e quali errori ci sono nei codici.
Prova intanto a modificare questo la riga del "$result_load=...." ecc in questo modo:
$result_load=mysql_query($query_load) or die("errore caricamento dati<br><br>".$query_load."<br><br>".mysql_error());
in questo modo chiedi alla funzione php "mysql_query" che è quella che lancia la stringa SQL sul server mysql, che in caso di "morte" (il 'or die(...)') deve restituire a video l'errore "errore caricamento dati" con due comandi html di break "<br>" la stringa del comando di cui si è chiesta l'esecuzione (che è quella nella variabile $query_load dichiarata alla riga precedente di codice) seguito da altri due <br> html e infine di stampare anche il messaggio di errore che ha restituito il mysql durante il tentativo di lancio attraverso la funzione "mysql_error()"
Prova a cambiare questo codice apri la pagina e scrivi il testo che ti risulta fuori così vediamo dove è il problema se sta nella query o magari nella struttura database. Ti sei accertata immagino che nella tabella "personaggio" del database esista il campo "esterno" di tipo varchar o text dato che ci va messo il testo delle note del fato.. controlla magari è dichiarato male il campo o non è corretto il nome. Nel frattempo prova con la modifica e con il messaggio completo di errore vediamo che ne viene fuori.
Alcune domande di controllo che mi vengono così al volo da farti sono:
Come si chiama il file in cui hai tutto questo codice?
É tutto nello stesso file php?
Dentro il file contente questo codice o nel file che include questo o la richiama, ci sono i comandi di collegamento al database e di configurazione del mysql?
05/09/2012 05:43:19
E' comunque molto piacevole leggere che c'è qualcuno disposto a perdere un po' del suo tempo a dare una mano :)
Tornando a noi:
Ti faccio una domanda a questo punto, stai usando immagino un CMS, mi dici qual'è così per rendermi conto?
Non ho idea di cosa sia un CMS (ho dovuto cercarlo su google, sempre perchè le mie conoscenze di php/programmazione/ecc sono limitate alla pratica ed al cosiddetto "prova e riprova") ma posso dirti che lavoro sul Notepad presente nel pc, e che a volte sfrutto l'Editor fornito da Altervista direttamente sulla pagina.
Prova intanto a modificare questo la riga del "$result_load=...." ecc in questo modo:
$result_load=mysql_query($query_load) or die("errore caricamento dati<br><br>".$query_load."<br><br>".mysql_error());
Chiarissimo quello che hai fatto, e questo è quello che mi appare come errore:
errore caricamento dati
SELECT personaggio.esterno FROM personaggio WHERE Nome = 'Nomepg'
Table 'my_lword.personaggio' doesn't exist
Ti sei accertata immagino che nella tabella "personaggio" del database esista il campo "esterno" di tipo varchar o text dato che ci va messo il testo delle note del fato..
La tabella Personaggio esiste (ha la maiuscola, però!) ed esiste anche il campo Esterno (sempre maiuscolo), di tipo text.
Dato che già prima mi era venuto il dubbio delle maiuscole, ho provato a cambiarle a cominciare dalla query, mettendo la maiuscola prima solo al nome della tabella, poi, quando usciva come errore "Unknown column 'personaggio.esterno' in 'field list'" ho provato anche a cambiare le maiuscole del campo, ed ecco l'errore che mi compare:
Fatal error: Call to undefined function: mysql_num_row() in /membri/lword/scheda1prova.php on line 713
Come si chiama il file in cui hai tutto questo codice?
É tutto nello stesso file php?
Dentro il file contente questo codice o nel file che include questo o la richiama, ci sono i comandi di collegamento al database e di configurazione del mysql?
Il nome del file è scheda1prova.php e il codice è tutto nella stessa pagina. I collegamenti al database ci sono e funzionano, perchè la pagina era praticamente già completa di tutto.
Con il codice che ho postato all'inizio, so anche che, mettendo una variabile qualunque al posto della variabile $Esterno (quella che d'altronde avevo sbagliato) della query , la stringa veniva inviata, quindi deduco che i collegamenti funzionino.
05/09/2012 09:38:20
Quindi da quel che ho capito sistemando i nomi tabella e campo l'errore che ti restituisce non è più quello precedente ma questo:
Fatal error: Call to undefined function: mysql_num_row() in /membri/lword/scheda1prova.php on line 713
giusto?
questo si risolve facilmente.. errore mio di battitura nel codice che ti ho scritto prima, pardon, la funzione è
mysql_num_rows
con la "s" in più.
Il CMS.. giusto, è come avrai trovato dalla ricerca che hai fatto già un sistema già predisposto su cui lavorare e da personalizzare, qui su gdr-online ad esempio in molti usano "gdrcd 5" per dire, che da una base di strumenti già scritti da personalizzare magari o da ritoccare qua e la in base alle esigenze. L'alternativa è appunto scrivere tutto da 0 con solo codice personale. Se stai seguendo la seconda via bhè tanto di cappello una via indubbiamente più ardua ma sicuramente buona da seguire passo passo per imparare e sviluppare ad ogni modo codice tuo personale.
Vedi un po' se con questa piccola modifica della funzione mysql_num_rows risolvi definitivamente allora, mi pare che ci sia tutto e tutto dovrebbe essere ok a questo punto dalle risposte che mi hai riportato :)
05/09/2012 17:29:59 e modificato da raccoon il 05/09/2012 17:48:45
mysql_num_rows
con la "s" in più.
Ora non mi dà più errore, infatti :D Solo che non funziona. O meglio, all'interno della textarea appaiono i dati presenti nel database, nella cella Esterno della tabella Personaggio (ho provato ad inserire dati manualmente per fare una prova) tuttavia sembra che la query di Upload non funzioni: non solo non aggiorna i dati, ma non li inserisce nemmeno quando la cella è vuota.
Ho persino provato ad eliminare la query ($query_update="";) tanto per vedere se la pagina lo riteneva fondamentale e mi dava errore, e invece la pagina si legge comunque, non c'è nessun cambiamento. Quindi mi viene il dubbio che ci sia qualche problema con l'upload dei dati a questo punto..è un'Odissea..
Il CMS..
Uso Gdrcd, e sto facendo alcune piccole modifiche via via. La Land è già stata messa su qualche anno fa dal programmatore che ci ha semi abbandonati, quindi mi occupo di queste cose imparando man mano dal codice preesistente!
Modifico per:
$result_update = mysql_query($query_update ) or die ("errore critico nella query salvataggio dati<br><br>".$query_update."<br><br>".mysql_error());
Ho provato a fare come mi avevi detto, con mysql_error() ma non mi dà alcun tipo di errore.
05/09/2012 17:50:07
Come te, non sono un grande esperto di programmazione e tendo quindi a cercare le scorciatoie. Leggendo quello che vorresti ottenere mi è venuta in mente che potresti utilizzare il pacchetto NEWS liberamente scaricabile dalla sezione Open Source.
Gestisce tutto quello che riguarda l'inserimento in form con comunicazione diretta con il DB, modifica e cancellazione e tutto ad opera dei master.
Magari partendo da quello, con modifiche meno impegnative e più veloci, potresti trasformarlo in quello che stai cercando di ottenere.
05/09/2012 18:31:55
Ok prova così allora cambia l'ultima parte della textarea. Ormai deve funzionare è solo questione di una qualche piccola svista sicuramente. Modifica il codice per stampare la text area con questo:
echo '
<form onSubmit="return Conferma();" action="scheda1prova.php" method=Post>
<tr><td>
NOTE FATO
<textarea cols=47 rows=15 name="Note_Fato">'.$note_fato.'</textarea>
<input type="hidden" name="esterno" value="save" />
<input type="submit" name="submit" value=" Aggiungi Note " style="color:white;background:red">
</td></tr>
</form>';
era stato usato l'input submit che non invia valore ma serve solo per lanciare il form. Necessiti di un input "hidden" con il nome e un valore per entrare nell'if in cima al file che esegue poi il codice di salvataggio. Prova così e fammi sapere ;)
05/09/2012 18:38:31 e modificato da leoblacksoul il 05/09/2012 18:40:43
Mi pare che raccon non stia lavorando con gdrcd5 (somiglia più al 3 vedendo le variabili di sessione, e dice di averlo iniziato anni fa), la patch news è per il 5 quindi non può usarla.
Ti suggerirei un paio di modifiche di sicurezza:
//controlli i permessi, visualizzazione dati e form
if ( ($_SESSION['Admin_S']==1)||($_SESSION['Master_S']==1)||($_SESSION['Master_S']==2)) {
//controlli se è stato inviato il post di nome 'esterno'
//quindi se è stata inviata l'operazione di invio dati.
if (isset($_POST['esterno'])){
//prendi il post della text area chiamata note_fato e gli
//aggiungi direttamente gli slash per filtrare l'input dati
$note_fato= addslashes($_POST['Note_Fato']);
$query_update = "UPDATE Personaggio SET Esterno = '".$note_fato."' WHERE Nome = '".$pg."' ";
$result_update = mysql_query($query_update );
//controllo operazione effettuata
if ($result_update==TRUE){
$conferma="Note Fato aggiornate";
$titolo="Note Fato aggiornate!";
}else {
$conferma="Qualcosa, nella registrazione dei dati, è andato storto.";
$titolo="Registrazione dei dati NON avvenuta.";
}
}
//carichi i dati, così se sono stati appena modificati
//dall'operazione precedente vengono caricati già aggiornati
$query_load = "SELECT Esterno FROM Personaggio WHERE Nome = '".$pg."' ";
$result_load=mysql_query($query_load);
$note_fato="";
//controlli se sono stati trovati dati quindi
//se il result è maggiore di 0 righe caricate
if (mysql_num_rows($result_load) > 0) {
//passi i dati all'array, io utilizzo questo metodo non è
//obbligatorio ma mi trovo più comodo ed è più leggibile poi il codice
$array_load=mysql_fetch_array($result_load);
$note_fato=$array_load['esterno'];
}
//stampi a video la text area e ci metti la stampa unita della
//variabile caricata in precedenza "$note_fato" tra i tag della
//text area così ti riporta i dati che avevi sul database
echo '
<tr><td>
<form onSubmit="return Conferma();" action="scheda1prova.php" method="post">
NOTE FATO
<textarea cols="47" rows="15" name="Note_Fato">'.htmlentities($note_fato).'</textarea>
<input type="hidden" name="esterno" value="1" />
<input type="submit" value="Aggiungi Note" style="color:white;background:red" />
</form>
</td></tr> ';
}
Secondo me così funziona....non funzionava perchè c'erano (ancora) delle incongruenze con le lettere maiuscole/minuscole. Ho corretto un po' anche l'HTML.
eldiabolo, perchè fai i controlli sul successo della query con gli if/else? Se metti già "or die()" è inutile farli, dato che lo script non arriverà mai ad eseguire l'else nel caso di errore.
05/09/2012 18:47:29
Secondo me così funziona....non funzionava perchè c'erano (ancora) delle incongruenze con le lettere maiuscole/minuscole. Ho corretto un po' anche l'HTML.
eldiabolo, perchè fai i controlli sul successo della query con gli if/else? Se metti già "or die()" è inutile farli, dato che lo script non arriverà mai ad eseguire l'else nel caso di errore.
L'Html non fa differenza tra maiuscole e minuscole se si tratta di parole chiavi quindi non era sicuramente quello il problema. Mancava unicamente un oggetto da far agganciare all'if contenente il codice di update dati.
Il controllo ulteriore in realtà restituisce errori in caso in cui la query sintatticamente è corretta ma a causa di dati errati non viene aggiornato nulla. Esempio se si fa un UPDATE di dati di una riga inesistente.
I controlli di query che hai rimosso erano unicamente stati inseriti perchè è una pagina di testing, è bene che ci sia la stampa degli errori dato che non si tratta di una pagina di funzione già pubblicata come detto nei precedenti post. Ecco spiegati i vari punti. Ad ogni modo vediamo se così finalmente viene eseguito correttamente o se ha altri problemi ^_^
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
World of Warship ↗
World of Tanks ↗
Hero Wars ↗
State of Survival ↗
Project Entropy ↗
The Coven ↗
Enlisted ↗
CRSED: F.O.A.D. ↗
Neverness to Everness ↗