Salvare dei dati in una determinata tabella in base al select che l'utente seleziona

Soulfearor

Utente Attivo
16 Set 2014
54
0
6
Torino
www.serenagraficatorino.it
Salve a tutti sono nuovo e da poco mi sto avvicinando al PHP ma per me è ancora molto sconosciuto. Ho un problema in questo script e sono sicuro che l'errore è stupido ma non riesco a trovarlo.

Ho un form:
HTML:
<form action="carica.php"  metod="post">
	Nome prodotto:<input type="text" name="nome"/>
        Collezione:<input type="text" name="collezione" />
        Descrizione:<textarea name="descrizione" class="form-control" rows="3"></textarea>
        Categoria:
                <select name="categoria"> 
                        <option value="1">primavoce</option>
                        <option value="2">secondavoce</option>
                        <option value="3">terzavoce</option>
                        <option value="4">quartavoce</option>
                </select> 
        <button type="submit" name="carica">Carica</button>
</form>

In un database ho 4 tabelle chiamate come le voci del select e la rispettiva tabella deve essere popolata con i dati del form quando preme il pulsante "carica". Se seleziona "primavoce" deve essere creato un nuovo record nella tabella "primavoce" e così via.

PHP:
// connessione
$connessione = mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db ('database', $connessione) or die(mysql_error());

$categoria = $_POST['categoria'];

if($_REQUEST['nome'] != "") {
	if($categoria == 1) {
		$query = "insert into primavoce values ('','".$_REQUEST['nome']."','".$_REQUEST['collezione']."','".$_REQUEST['descrizione']."')";
		mysql_query($query) or die(mysql_error());
	}
	if($categoria == 2) {
		$query = "insert into secondavoce values ('','".$_REQUEST['nome']."','".$_REQUEST['collezione']."','".$_REQUEST['descrizione']."')";
		mysql_query($query) or die(mysql_error());
	}
	else { echo 'errore'; }
}

Con questo script qua mi visualizza errore e non carica niente. Se al posto di "if($categoria == 2)" metto "if($categoria = 2)" idem per tutti gli altri, mi carica il record in ogni tabella.

Come posso risolvere questo problema?

Grazie anticipatamente.
Buona giornata :)
 
Ciao,
dato che quando imposti la variabile $categoria in modo forzato usando
PHP:
if($categoria = 2)
L'inserimento funziona, significa che ti connetti con successo al database e le queries sono corrette, quindi il problema è nel codice PHP.
Prova a selezionare, una alla volta, tutte le opzioni del form e a vedere cosa succede.
Se per alcune opzioni funziona e per altre no, significa che per queste ultime non hai specificato alcuna condizione.
Se invece il comportamento è identico, sostituisci
PHP:
    else { echo 'errore'; }
Con
PHP:
    else { echo 'errore. Categoria: '.$categoria.' <br>
Dato passato tramite POST: '.$_POST['categoria']; }
In questo modo dovresti accorgerti di eventuali errori di logica.
Se non noti ancora nulla di strano, aggiungi all'inizio della tua pagina in PHP:
PHP:
error_reporting(E_ALL);
E vedi se esce fuori qualcosa



Solo alcune precisazioni importanti:
L'estensione mysql_ è deprecata, è sempre meglio usare mysqli_.
Inoltre, il tuo codice è aperto all'SQL injection.
Ecco la versione debuggata:

PHP:
// connessione 
$connessione = mysqli_connect('localhost', 'root', '','database');

$categoria = $_POST['categoria']; 

if($_REQUEST['nome'] != "") { 
    if($categoria == 1) { 
        $query = "insert into primavoce values ('','".mysqli_real_escape_string($connessione,$_REQUEST['nome'])."','".mysqli_real_escape_string($connessione,$_REQUEST['collezione'])."','".mysqli_real_escape_string($connessione,$_REQUEST['descrizione'])."')"; 
        mysqli_query($connessione,$query) or die(mysqli_error()); 
    } 
    if($categoria == 2) { 
        $query = "insert into secondavoce values ('','".mysqli_real_escape_string($connessione,$_REQUEST['nome'])."','".mysqli_real_escape_string($connessione,$_REQUEST['collezione'])."','".mysqli_real_escape_string($connessione,$_REQUEST['descrizione'])."')"; 
        mysqli_query($connessione,$query) or die(mysqli_error()); 
    } 
    else { echo 'errore'; } 
}
 
Ultima modifica:
Innanzitutto grazie per le risposte :)

Rispondo a borgo italia .. ho perso un po' di tempo dietro al codice php dal momento che, visto che mi sto avvicinando da poco ad esso, avrò fatto sicuramente un errore li e invece con mio stupore l'errore era l' H mancante in method come hai scritto anche te >_> .. non avevo pensato che il codice php si interlacciava a quello html del form e magari un errore era presente li .. ottimo, la prossima volta saprò dove guardare :)

Rispondo a Altutto .. ho letto la tua risposta e appena ho un attimo di tempo leggo cosa fanno esattamente le varie istruzioni che hai aggiunto o modificato.
Ho provato a modificare quella parte di codice e funziona come prima, che non dia errore è già un bell'inizio xD
Ho notato che "mysqli" deve essere sostituito a "mysql" .. dici che è deprecata, da quanto? nei vari tutorial in giro per la rete la usano ancora, cosa comporta se dovesse essere usata? ti chiedo perchè ho voglia di imparare ma sono ancora agli inizi.

Inoltre, il tuo codice è aperto all'SQL injection.
Non è un problema che mi sono posto ma che ci avrei fatto sicuramente caso successivamente, grazie per avermelo accennato e per un esempio pratico .. ho notato che hai riportato la variabile $connessione in tante parti di codice, la chiave è proprio quella? se si dove mi consigli di utilizzarla? oltre in questi casi intendo.

Scusa per le mille domande, ma rispetto a tutte quelle che vorrei fare sono poche xD
Se non hai tempo o voglia di rispondere nessun problema :) ti capirei xD

Buona serata.
 
Ciao :)
mysql_ è deprecato a partire da PHP 5.5.0, e verrà rimosso del tutto in futuro, pertanto, se lo utilizzerai, ti ritroverai comunque a dover esegurire l'upgrade presto.
Mysqli_ presenta diversi miglioramenti, per citare php.net:
The mysqli extension, or as it is sometimes known, the MySQL improved extension, was developed to take advantage of new features found in MySQL systems versions 4.1.3 and newer. The mysqli extension is included with PHP versions 5 and later.

The mysqli extension has a number of benefits, the key enhancements over the mysql extension being:

Object-oriented interface

Support for Prepared Statements

Support for Multiple Statements

Support for Transactions

Enhanced debugging capabilities

Embedded server support

Note:
If you are using MySQL versions 4.1.3 or later it is strongly recommended that you use this extension.


Ho riportato molte volte $connessione perchè mysqli, a differenza di mysql, richiede che vengano passati come primo parametro di mysqli_query ed altre funzioni (come mysqli_real_escape_string) i dati di connessione per il database, quindi
PHP:
mysql_query($query); => mysqli_query($connessione,$query);
Per evitare un attacco dovuto all'SQL injection, ho utilizzato mysqli_real_escape_string: puoi divertirti a vedere come funziona lanciando questo codice e modificando le variabili :)
PHP:
<?php
$connessione = mysqli_connect("localhost","root","","db");
$variabile1 = "ciao";
echo 'Variabile1: '.mysqli_real_escape_string($connessione,$variabile1).'<br>';
$variabile2 = "sono un'altra variabile";
echo 'Variabile2: '.mysqli_real_escape_string($connessione,$variabile2).'<br>';
$variabile3 = 'Adoro il film "Tal dei tali"';
echo 'Variabile3: '.mysqli_real_escape_string($connessione,$variabile3).'<br>';
?>

Tranquillo, è un piacere :)
Buona serata anche a te :)
 
Fantastico :) .. no no che upgrade, preferisco partire da adesso a conoscerle e ad usarle ^^

Ho riportato molte volte $connessione perchè mysqli, a differenza di mysql, richiede che vengano passati come primo parametro di mysqli_query ed altre funzioni (come mysqli_real_escape_string) i dati di connessione per il database, quindi
PHP:
mysql_query($query); => mysqli_query($connessione,$query);
Non so ancora bene dove devono essere passati 2 parametri ma se sbaglio ci sono i messaggi di errore a bacchettarmi .. esempio per "mysqli_fetch_assoc" il parametro di connessione non gli serve.

Per evitare un attacco dovuto all'SQL injection, ho utilizzato mysqli_real_escape_string: puoi divertirti a vedere come funziona lanciando questo codice e modificando le variabili :)
PHP:
<?php
$connessione = mysqli_connect("localhost","root","","db");
$variabile1 = "ciao";
echo 'Variabile1: '.mysqli_real_escape_string($connessione,$variabile1).'<br>';
$variabile2 = "sono un'altra variabile";
echo 'Variabile2: '.mysqli_real_escape_string($connessione,$variabile2).'<br>';
$variabile3 = 'Adoro il film "Tal dei tali"';
echo 'Variabile3: '.mysqli_real_escape_string($connessione,$variabile3).'<br>';
?>
Proverò :)

Tranquillo, è un piacere :)
Lo apprezzo, è ammirevole, tanta gente non ha voglia di scrivere 2 righe come hai fatto te.

Ciau!
 
ciao
il fatto che mancasse l'H non faceva trasmettere i valori quindi $_POST e altri risultavano vuoti.
impara, visto che sei agli inizi, ad usare la funzione var_dump(qualcosa) è un ottimo supporto per il debug
qualcosa = o una variabile es $pinco, o una funzione.
se tu avessi messo messo nella pagina carica.php
PHP:
<?php
//.....
mysql_select_db ('database', $connessione) or die(mysql_error());
var_dump($_POST['categoria']);
$categoria = $_POST['categoria'];

if($_REQUEST['nome'] != "") {
//....
?>
avresti ottenuto NULL quindi evidente che la variabile non viene trasmessa
una voltatrovato l'errore la togli o la commenti
 
ciao
il fatto che mancasse l'H non faceva trasmettere i valori quindi $_POST e altri risultavano vuoti.
impara, visto che sei agli inizi, ad usare la funzione var_dump(qualcosa) è un ottimo supporto per il debug
qualcosa = o una variabile es $pinco, o una funzione.
se tu avessi messo messo nella pagina carica.php
PHP:
<?php
//.....
mysql_select_db ('database', $connessione) or die(mysql_error());
var_dump($_POST['categoria']);
$categoria = $_POST['categoria'];

if($_REQUEST['nome'] != "") {
//....
?>
avresti ottenuto NULL quindi evidente che la variabile non viene trasmessa
una voltatrovato l'errore la togli o la commenti
Interessante come cosa!! .. grazie mille ne farò sicuramente uso :)
 
@Soulfearor per capire quali parametri passare puoi sempre far riferimento al manuale di php :)
Giusto per farti qualche esempio, devi passare il parametro di connessione per:
mysqli_query
mysqli_real_escape_string
mysqli_close
Mentre non devi passarlo se usi funzioni come mysqli_num_rows o mysqli_fetch_assoc

Ciao :)
 

Discussioni simili