View Full Version : [MySql]: valori INT
Ho una tabella MySql con un campo intero.
Il valore di questo campo è impostato tramite una query che gli assegna un numero determinato da una funzione random.
se ad esempio questa funione genera il numero 2045 nel campo viene inserito 706!! come è possibile?
Ho una tabella MySql con un campo intero.
Il valore di questo campo è impostato tramite una query che gli assegna un numero determinato da una funzione random.
se ad esempio questa funione genera il numero 2045 nel campo viene inserito 706!! come è possibile?
Evidentemente viene ri-generato il numero prima dell'insert (se ti fai stampare la query...).
Prova a postare la query va :)
Evidentemente viene ri-generato il numero prima dell'insert (se ti fai stampare la query...).
Prova a postare la query va :)
<?php
include "contr_login.php";
$pagamento=$_GET['pagamento'];
$codice = $_GET['codice'];
$db_user = "root";
$db_password = "quindici";
$db_database = "sito";
$connessione=mysql_connect($db_host,$db_user,$db_password);
$nome=$_SESSION['user'];
$numordine = rand(1, 3000); <----------------
$recset=mysql_db_query("sito","SELECT * FROM carrello WHERE username='$nome' ",$connessione);
$numrec=mysql_num_rows($recset);
for ($cont=0; $cont<$numrec; $cont++)
{
$id=mysql_result($recset,$cont,"id");
$nome=mysql_result($recset,$cont,"username");
if($pagamento == "Bonifico Bancario")
{
$recset1=mysql_db_query("sito","INSERT INTO ordini (idord, username, numordine) VALUES('$id', '$nome', '$numordine')",$connessione);
$numrec1=mysql_affected_rows($connessione);
}
else
if($pagamento == "Carta di credito")
{
-------> $recset1=mysql_db_query("sito","INSERT INTO ordini (idord, username, codcarta, numordine) VALUES('$id', '$nome', '$codice', '$numordine')",$connessione);
$numrec1=mysql_affected_rows($connessione);
}
}
con le frecce ho indicato il codice interessato
Ok, pensavo che come rand usassi la funzione di MySQL (interna alla Query) e non una funzione PHP 'esterna'.
Allora, vediamo insieme: prima di tutto la funzione che usi, mysql_db_query() è depecrata a partire dalla versione 5.3 di PHP, quindi fai attenzione: meglio NON usare mai funzioni depecrate.
Puoi sostituire il tutto con l'abbinamento mysql_select_db(database, conn) e mysql_query(query); per eseguire in ordine, il 'select' del db e la query.
Per il tuo problema è strano: posso consigliarti di stamparti la var numordine PRIMA e DOPO i ciclo e dirmi che risultato ti torna? PS segnati anche il risultato nella query.
PS. sfruttare un rand() per creare numeri d'ordini non è il massimo, se ti capitano dentro due numeri uguali ? (difficile ma possibile). Usa piuttosto una funzione di controllo o un campo auto-incrementale. MySQL ha questo limite purtroppo, ti tornerebbe un errore e si bloccherebbe tutto.
Ok, pensavo che come rand usassi la funzione di MySQL (interna alla Query) e non una funzione PHP 'esterna'.
Allora, vediamo insieme: prima di tutto la funzione che usi, mysql_db_query() è depecrata a partire dalla versione 5.3 di PHP, quindi fai attenzione: meglio NON usare mai funzioni depecrate.
Puoi sostituire il tutto con l'abbinamento mysql_select_db(database, conn) e mysql_query(query); per eseguire in ordine, il 'select' del db e la query.
Per il tuo problema è strano: posso consigliarti di stamparti la var numordine PRIMA e DOPO i ciclo e dirmi che risultato ti torna? PS segnati anche il risultato nella query.
PS. sfruttare un rand() per creare numeri d'ordini non è il massimo, se ti capitano dentro due numeri uguali ? (difficile ma possibile). Usa piuttosto una funzione di controllo o un campo auto-incrementale. MySQL ha questo limite purtroppo, ti tornerebbe un errore e si bloccherebbe tutto.
so che potrebbe dare l'ultimo problema che hai spiegato, però per come ho impostato il database non mi venivano altre soluzioni. pensavo di controllare ogni volta se il numero era presente in tabella.
in pratica io inserisco ogni prodotto di un ordine nella tabella(ad esempio: se un ordine ha 5 prodotti io avrò 5 record con lo stesso numero d'ordine e riferito allo stesso utente), quindi se uso un campo autoincrementale questi record di uno stesso ordine avrebbero numero differente. Spero di essermi spiegata bene! hai altre soluzioni da suggerirmi?
Ho provato a stampare come hai detto, sia prima che dopo il ciclo i numeri sono uguali, vengono cambiati all'interno del database!
ti ringrazio intanto per la risposta!
so che potrebbe dare l'ultimo problema che hai spiegato, però per come ho impostato il database non mi venivano altre soluzioni. pensavo di controllare ogni volta se il numero era presente in tabella.
in pratica io inserisco ogni prodotto di un ordine nella tabella(ad esempio: se un ordine ha 5 prodotti io avrò 5 record con lo stesso numero d'ordine e riferito allo stesso utente), quindi se uso un campo autoincrementale questi record di uno stesso ordine avrebbero numero differente. Spero di essermi spiegata bene! hai altre soluzioni da suggerirmi?
Ho provato a stampare come hai detto, sia prima che dopo il ciclo i numeri sono uguali, vengono cambiati all'interno del database!
ti ringrazio intanto per la risposta!
Si una soluzione ci sarebbe: non usare l'incrementale :P.
Prima però concentriamoci sull'errore.
Ti sei mandato in stampa la query? Metti tutta la query i una variabile PHP e mandala in stampa se i valori PHP rimangono invariati nel percorso del ciclo allora sono invariati anche nella query, ergo il valore si cambia al momento dell'insert into di MYSQL; curiosità, che campo hai usato per la tabella?
Per il quesito, in questo caso fai bene.
Alternativa sarebbe fare una tabella 'relazioni' con id prodotto e codice ordine :)
Si una soluzione ci sarebbe: non usare l'incrementale :P.
Prima però concentriamoci sull'errore.
Ti sei mandato in stampa la query? Metti tutta la query i una variabile PHP e mandala in stampa se i valori PHP rimangono invariati nel percorso del ciclo allora sono invariati anche nella query, ergo il valore si cambia al momento dell'insert into di MYSQL; curiosità, che campo hai usato per la tabella?
Per il quesito, in questo caso fai bene.
Alternativa sarebbe fare una tabella 'relazioni' con id prodotto e codice ordine :)
Ho modificato il codice in questo modo (ho anche stampato la query):
<?php
include "contr_login.php";
$pagamento=$_GET['pagamento'];
$codice = $_GET['codice'];
$db_user = "root";
$db_password = "quindici";
$db_database = "sito";
$connessione=mysql_connect($db_host,$db_user,$db_password);
$nome=$_SESSION['user'];
$controlla= 0;
while ($controlla == 0)
{
$numordine = rand(1, 2000);
$recset2=mysql_db_query("sito","SELECT * FROM ordini WHERE numordine ='$numordine' ",$connessione);
$numrec2=mysql_num_rows($recset2);
if ($numrec2 == 0)
$controlla=1;
else
$controlla=0;
}
$recset=mysql_db_query("sito","SELECT * FROM carrello WHERE username='$nome' ",$connessione);
$numrec=mysql_num_rows($recset);
for ($cont=0; $cont<$numrec; $cont++)
{
$id=mysql_result($recset,$cont,"id");
$nome=mysql_result($recset,$cont,"username");
if($pagamento == "Bonifico Bancario")
{
$recset1=mysql_db_query("sito","INSERT INTO ordini (idord, username, numordine) VALUES('$id', '$nome', '$numordine')",$connessione);
$numrec1=mysql_affected_rows($connessione);
$recset3=mysql_db_query("sito","SELECT * FROM ordini WHERE username='$nome' ",$connessione);
$numrec3=mysql_num_rows($recset3);
for ($cont3=0; $cont3<$numrec3; $cont3++){
$idord=mysql_result($recset3,$cont3,"idord");
$username=mysql_result($recset3,$cont3,"username");
$numordine=mysql_result($recset3,$cont3,"numordine");
echo $idord.$username.$cogn.$numordine;}
}
else
if($pagamento == "Carta di credito")
{
$recset1=mysql_db_query("sito","INSERT INTO ordini (idord, username, codcarta, numordine) VALUES('$id', '$nome', '$codice', '$numordine')",$connessione);
$numrec1=mysql_affected_rows($connessione);
}
}
echo "<h3>Greazie ".$nome." il tuo ordine è stato inoltrato correttamente!</h3>";
echo "<h2>Ricorda il tuo numero di ordine: ".$numordine."</h2>";
echo "<p1>Riceverai entro poche ore un sms di conferma al numero di cellulare da te indicato. Entro una settimana lavorativa dalla conferma riceverai i prodotti.
Affinchè possa andare tutto a buon fine ti invitiamo a prendere visione del regolamento tramite la sezione 'Modalità di consegna' e 'Modalità di pagamento'</p1>";
mysql_close($connessione);
?>
</body>
</html>
Non so come mai, ma adesso i numeri sono riportati correttamente in tabella, xo ho altri due problemi:
1. se ho due ordini diversi dello stesso cliente e con uno stesso prodotto la query non viene eseguita;
2. se eseguo un nuovo ordine con un cliente differente la query viene eseguita solo se la tabella ordini risulta vuota.
non capisco il motivo dal momento in cui non ho fatto nessuna distinzione tra tabella piena o vuota!!
Ho risolto!!!
Sarà l'ora tarda, ma non mi ero accorda che avevo definito come chiave primaria idord(che sarebbe l'id del prodotto, dovrei cambiare il nome effettivamente) e quindi logicamente non poteva avere più valori uguali in record differenti! grazie cmq per la pazienza!
Ho risolto!!!
Sarà l'ora tarda, ma non mi ero accorda che avevo definito come chiave primaria idord(che sarebbe l'id del prodotto, dovrei cambiare il nome effettivamente) e quindi logicamente non poteva avere più valori uguali in record differenti! grazie cmq per la pazienza!
Assolutamente no, è la limitazione che ti dicevo di MySQL ;).
Devi fare molta attenzione a questo quando lavori con MySQL.
PS. La prossima volta che 'posti' del codice, usa i TAG specifici del Forum, eviti il mal di testa a tutti noi :D
PS. La prossima volta che 'posti' del codice, usa i TAG specifici del Forum, eviti il mal di testa a tutti noi :D
ok! :D
ho un'altima domanda e poi non rompo più! mi sono accorta che tutto funziona perfettamente nel secondo if, mentre ho un piccolo problema nel primo. mi inserisce correttamente il record xo come prima lo copia due volte e con un codice ordine differente. ho provato a stampare il numero di record che vengono inseriti e mi da uno, ma poi effettivamente ce ne sono due in tabella!
ok! :D
ho un'altima domanda e poi non rompo più! mi sono accorta che tutto funziona perfettamente nel secondo if, mentre ho un piccolo problema nel primo. mi inserisce correttamente il record xo come prima lo copia due volte e con un codice ordine differente. ho provato a stampare il numero di record che vengono inseriti e mi da uno, ma poi effettivamente ce ne sono due in tabella!
I casi possono essere tre:
a) esiste già il record nel DB, MySQL lo ignora e lo re-inserisce (cosa possibile ma non mi sembra il caso, controlla comunque).
b) il ciclo viene eseguito n+1 volte del previsto.
c) la seconda condizione (IF) viene ritenuta vera 2 volte.
Controlla.
Per controlla intendo, fai il DEBUG.
Ricordati, il debug è il miglior nemico di un programmatore :D ti fa sempre incazzare ;)
I casi possono essere tre:
a) esiste già il record nel DB, MySQL lo ignora e lo re-inserisce (cosa possibile ma non mi sembra il caso, controlla comunque).
b) il ciclo viene eseguito n+1 volte del previsto.
c) la seconda condizione (IF) viene ritenuta vera 2 volte.
Controlla.
Per controlla intendo, fai il DEBUG.
Ricordati, il debug è il miglior nemico di un programmatore :D ti fa sempre incazzare ;)
ho provato a riguardare tutto in base a quello che mi hai detto e non penso sia uno dei tre casi possibili:
a) anche con la tabella vuota inserisce sempre due volte;
b) no perchè stampando la query mi dice correttamente che ha inserito una sola riga e poi se eseguisse più volte il ciclo credo che dovrebbe dare lo stesso problema anche sul secondo if;
c) avevo pensato anche io a quello ma evidentemente non è dato che ho provato a togliere il secondo if (quello corretto) e il problema non cambia.
penso a questo punto che lo lascerò così sperando che il prof non se ne accorga! :D
ho provato a fare la query da mysql ed è corretta..
ho provato a riguardare tutto in base a quello che mi hai detto e non penso sia uno dei tre casi possibili:
a) anche con la tabella vuota inserisce sempre due volte;
b) no perchè stampando la query mi dice correttamente che ha inserito una sola riga e poi se eseguisse più volte il ciclo credo che dovrebbe dare lo stesso problema anche sul secondo if;
c) avevo pensato anche io a quello ma evidentemente non è dato che ho provato a togliere il secondo if (quello corretto) e il problema non cambia.
penso a questo punto che lo lascerò così sperando che il prof non se ne accorga! :D
ho provato a fare la query da mysql ed è corretta..
La condizione del for, < o <= ?
Controlla bene questo.
PS. fai l'Insubria di Varese per caso?
La condizione del for, < o <= ?
Controlla bene questo.
PS. fai l'Insubria di Varese per caso?
no studio a parma!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.