problema con una query INSERT sulla stessa pagina..

Ciao a tutti! Sono nuovo di questo forum, spero di trovarmi bene.. e penso proprio di sì O0

Premesso che non sono nuovo al php ma che nn sono neppure un esperto, vi sottopongo la mia questione molto pratica.. sto lavorando in ambiente WAMP (Windows Apache Mysql Php, tutti alle ultime versioni) e utilizzo la libreria mysqli..

Sto facendo una semplice pagina di inserimento per inserire un elemento in una tabella.. il mio problema sta nella memorizzazione sul database dell'elemento: la pagina dell'inserimento che contiene il form ha come action sè stessa.. ossia vorrei che all'invio dei dati, si ricaricasse la stessa pagina che chiama la query dell'inserimento.. fatta l'operazione di inserimento, si torna alla pagina indecs.php...

intendiamoci, il tutto va correttamente.. tranne per il dettaglio che il database a cui la pagina si corrette senza errori non memorizza l'inserimento.. come mysqli, cosa devo fare???

per essere più chiari, ecco il codice (per correttezza aggiungo che questo codice è  più che ispirato ad un articolo di php.html.it incompleto):

<?php

$mysqli = new mysqli('localhost', 'root', 'pass', 'test');

if(!$mysqli)

{

    die("Errore di connessione al database, impossibile procedere.");

}

if(isset($_POST['action']) and $_POST['action'] == 'inserisci')

{

    $results = $mysqli->query("INSERT INTO articles VALUES ('', '".$_POST['autore']."', '".addslashes($_POST['titolo'])."', '".addslashes($_POST['articolo'])."')");

    if (!$results) {

       echo "<h1>Errore nella query!</h1>";

       exit;

    else{

       echo "Bella che funza!";

    }

    header('Location: indecs.php');

}

$authors = $mysqli->query("SELECT id, CONCAT(surname, ' ', name) AS fullname FROM authors ORDER BY surname ASC");

?>

<html>

    <head>

        <title>Inserimento articolo</title>

    </head>

    <body>

        <ul>

            <li><a href="indecs.php">Lista articoli</a></li>

            <li><a href="insert.php">Inserisci un articolo</a></li>

        </ul>

        <h3>Inserisci un articolo</h3>

        <form action="insert.php" method="post">

            <input type="hidden" name="action" value="inserisci" />

            <label>Autore:</label> <select name="autore">

                <?php

                //menù a tendina per scegliere l'autore

                while($a = $authors->fetch_assoc()){

                    echo "<option value=".$a['id'].">".$a['fullname']."</option>";

                }

                ?>

            </select><br />

            <label>Titolo:</label><input type="text" name="titolo" size="55"/><br />

            <label>Text:</label><br />

            <textarea name="articolo" rows="6" cols="60"></textarea><br />

            <input type="submit" value="Salva" />

        </form>

    </body>

</html>

qualche indizio? aiuto! :-P

inviato 9 anni fa
lucke84
X 0 X

Cambia

f (!$results) {
       echo "<h1>Errore nella query!</h1>";
       exit;
    else{
       echo "Bella che funza!";
    }

    header('Location: indecs.php');

in

f (!$results) {
       echo "<h1>Errore nella query!</h1>";
       exit;
}

header('Location: indecs.php');
exit;
risposto 9 anni fa
Gianni Tomasicchio
X 0 X

In pratica mi stai dicendo di levare un else e di fare un exit che con ogni probabilità non verrà mai eseguito?  ???

non credo risolverà il problema.. ma proverò cmq..  :D

AGGIUNGO:

no non funziona cmq  :buck:

risposto 9 anni fa
lucke84
modificato 9 anni fa
X 0 X

Questo codice è sbagliato:

f (!$results) {
       echo "<h1>Errore nella query!</h1>";
       exit;
    else{
       echo "Bella che funza!";
    }

    header('Location: indecs.php');

non te ne rendi conto perché non ti è chairo il funzionamento di header(). Infatti header non ti effettua immediatamente il redirect della pagina (magari!) ma si limita ad invaire una intestazione HTTP. Nel nostro caso è una Location.

Le intestazioni si possono inviare solo se la pagina non ha prodotto nessun output prima. In caso contrario, essendo una intestazione, non verrà inviato nulla. Quindi la sequenza di istruzioni:

echo "Bella che funza!";
header('Location: indecs.php');

non ti permette di effettuare il redirect per colpa dell'echo (a meno che tu non stia usando l'output buffering)

Ecco perché ti ho consigliato di toglierere quell'echo.

L'exit dopo l'header invece è necessario per terminare lo script dopo aver mandato l'intestazione. Infatti lo script mica si ferma ma continuerebbe ad eseguire le istruzioni che seguono header().

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

ok, ora ho capito. chiedo venia, nn conoscevo il funzionamento corretto di header   O0

ho fatto cm mi hai detto tu, levando l'else (contenente una echo) e riprovando mi stampava "errore nella query".

allora ho messo qualche echo prima del mesaggio d'errore per vedere se il contenuto di $_POST era corretto, ossia:

if(isset($_POST['action']) and $_POST['action'] == 'inserisci')

{

    $results = $mysqli->query("INSERT INTO articles VALUES ('', '".$_POST['autore']."', '".addslashes($_POST['titolo_articolo'])."', '".addslashes($_POST['testo_articolo'])."')");

    /* struttura della query in SQL

    INSERT INTO articles VALUES  ('id_articolo', 'id_autore', 'titolo_articolo', 'testo_articolo')

    dove id_articolo è intero non nullo autoincrement, e id_autore è la chiave esterna della tabella autori

    */

    if (!$results) {

       echo $_POST['autore']."<br>";

       echo $_POST['titolo_articolo']."<br>";

       echo $_POST['testo_articolo'];

       echo "<h3>Errore nella query!</h3>";

       exit;

    }

    header('Location: indecs.php');

    exit;

}

risultato: stampava correttamente tutti i valori...

a questo punto ho capito che l'errore poteva essere soltanto sul primo campo, quello che dovrebbe essere l'id del nuovo articolo e gli ho messo il primo valore utile: poichè c'erano sei record sulla tabella articles del database, quindi ho modificato la query così:

$results = $mysqli->query("INSERT INTO articles VALUES ('7', '".$_POST['autore']."', '".addslashes($_POST['titolo_articolo'])."', '".addslashes($_POST['testo_articolo'])."')");

e.. "magicamente" funziona...  :-\

nella mia ignoranza.. mi chiedo e vi chiedo, se il campo è di tipo autoincrement, non dovrei lasciare vuoto quel campo? e se nn posso farlo.. come posso aggirare l'ostacolo? devo recuperare prima il numero di record presenti nella tabella?  ???

chi sa parli.... grazie anticipatamente :bye:

risposto 9 anni fa
lucke84
modificato 9 anni fa
X 0 X

il modo corretto per far incrementare un campo autoincrement è

1) passare al campo il valore NULL

2) non contemplare il campo nella query di inserimento

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Purtroppo, né il metodo 1, né il metodo 2 hanno prodotto i risultati sperati..  :'(

mentre continua a funzionare il sistema del "passaggio manuale dell'indice esatto" (quello che ho indicato nel mio ultimo post)..

perchè abbiate una visione completa della situazione, vi posto la struttura del campo id della tabella autori, ossia il campo che dà problemi nella insert..

Campo -> id

Tipo -> INT

Lunghezza/Set -> 10

Collation -> ...

Attributi -> UNSIGNED

Null -> Not Null

Predefinito -> ...

Extra -> auto_increment

Commenti -> ...

* dove ho messo ... significa che nn vi ho assegnato alcun valore  ^-^

ordunque.. qualcuno gentilmente mi helpa?  :bye:

risposto 9 anni fa
lucke84
X 0 X

riporta la query di inserimento che stai usando (l'ultima versione)

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Eccola.. il valore 7 è il primo disponibile per la variabile id della tabella "articles".. ossia ci sono già 6 campi..

con questo sistema funziona.. in pratica, la volta successiva dovrei mettere io manualmente 8, la volta dopo 9, eccc...

$results = $mysqli->query("INSERT INTO articles VALUES ('7', '".$_POST['autore']."', '".addslashes($_POST['titolo_articolo'])."', '".addslashes($_POST['testo_articolo'])."')");
risposto 9 anni fa
lucke84
X 0 X

Prova così:

$results = $mysqli->query("INSERT INTO articles (autore, titolo, testo) VALUES ( '".$_POST['autore']."', '".addslashes($_POST['titolo_articolo'])."', '".addslashes($_POST['testo_articolo'])."')");

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Ora funzia!! grazie!  O0

 :bye:

risposto 9 anni fa
lucke84
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda