PDA

View Full Version : [SQL] Inserimento automatico campo ID e dubbio su viste


birmarco
06-01-2012, 21:46
Ciao a tutti!

Sto creando un'applicazione web in PHP che si occupa inserire e visualizzare informazioni contenute in una base di dati. Come DBMS uso MySQL, ultima versione. Il PHP è anch'esso all'ultima versione. Ho incontrato un paio di problemi, spero che qualcuno di voi possa aiutarmi.

Venendo al primo problema: ho creato un form compilabile da parte dell'utente che, una volta inviato, inserisce tramite query SQL i dati in alcune tabelle. Utilizzo il campo INSERT e tutto fuziona tranquillamente tranne che per il campo ID della tabella. E' una chiave primaria che corrisponde al numero della "riga" della tabella. E' a scopo identificativo. Vorrei che questo numero sia inserito in maniera automatica senza dover andare a leggere l'ultimo valore ID inserito precedentemente e incrementarlo di 1. Esiste un metodo automatico o per lo meno un pochino più elegante del mio? :)

Problema 2: Ho creato una vista che è il JOIN di 4 tabelle, collegate tramite il campo ID. Mi spiego meglio: la tabella A è collegata con C perchè contiene un campo ID_C che fa riferimento al capo ID di C. Lo stesso avviene tra B e C e B e D. Il problema è che questa vista ora ha delle colonne in più che non vorrei avere e che sono quelle dei campi ID che collegano le varie tabelle. Come posso eliminarle? O meglio, evitare di crearle? Il codice SQL che ho usato è questo:

CREATE VIEW `Schema1`.`Vista1`

AS SELECT *

FROM `A`, `B`, `C`, `D`

WHERE `A`.`ID_versoC` = `C`.`ID_C` AND `C`.`ID_versoB` = `B`.`ID_B` AND `C`.`ID_versoD` = `D`.`ID_D`

ORDER BY `A`.`ID_A` ASC;


Ho chiamato per semplicità le tabelle A, B, C e D e il loro ID chiave primaria come ID_* dove * è il nome della tabella. Gli attributi ID_verso* (dove * è sempre la tabella) contengono l'ID della tabella * a cui sono riferiti.

:) :)

Mettiu_
06-01-2012, 23:53
Problema 1) In MySQL devi impostare il campo chiave della tua tabella con l'opzione auto-increment così quando fai la insert lui setta in automatico il valore incrementato di uno (proprio come dici tu).

Problema 2) Il fatto è che tu nella query scrivi SELECT * quindi selezioni tutti i campi (con l'asterisco). Togli l'asterisco e metti la lista dei campi che vuoi visualizzare, ad es. SELECT A.campo1, B.campo2 FROM ecc ecc...

Spero di esserti stato d'aiuto :)

birmarco
07-01-2012, 00:02
Problema 1) In MySQL devi impostare il campo chiave della tua tabella con l'opzione auto-increment così quando fai la insert lui setta in automatico il valore incrementato di uno (proprio come dici tu).

Problema 2) Il fatto è che tu nella query scrivi SELECT * quindi selezioni tutti i campi (con l'asterisco). Togli l'asterisco e metti la lista dei campi che vuoi visualizzare, ad es. SELECT A.campo1, B.campo2 FROM ecc ecc...

Spero di esserti stato d'aiuto :)

Grazie mille! :)

Per il problema 2 --> :doh: :doh: Come ho fatto ad essere così stupido da non pensarci! :D

Approfitto della tua gentilezza! :D Ho un'altro problemino nel passare i valori al database. Quando premo pul pulsante di inserimento nella pagina un print che ho impostato io per visualizzare gli errori mi segnala

"Fatal error: Call to a member function bind_param() on a non-object in /membri/bachecaimmobili/pubblica.php on line 83"

Dalla linea 82 c'è questo:

$stmt = $conn->prepare("INSERT INTO A(ID_A, Titolo, ID_Imm, Contatto, Descrizione) VALUES(?, ?, ?, ?, ?)");

$stmt->bind_param("isiss", $ID, $title, $ID, $contatto, $descr);

$ID = 1;
$contatto = "Luigi";
$title = $_POST['titolo'];
$descr = $_POST['descrizione'];
$stmt->execute();

La variabile $ID l'avevo messa per ovviare al problema ID almeno nelle prove, ora imposto come mi hai spiegato tu :)

Mettiu_
07-01-2012, 00:13
Mmmm... Attenzione che hai preparato una query che ha 5 parametri, ma alla bind_param() ne stai passando 6!

birmarco
07-01-2012, 00:23
Mmmm... Attenzione che hai preparato una query che ha 5 parametri, ma alla bind_param() ne stai passando 6!

Ma non devo passare anche il parametro iniziale tra "" in cui metto, nell'ordine di passaggio s per le stringhe, i per i numeri int, d per i double e b per i blob?

Mettiu_
07-01-2012, 10:23
Si hai ragione! Ho cannato in pieno :-)
Non è quello il problema allora... Hai già visto gli esempi riportati sulla documentazione?
http://php.net/manual/en/mysqli-stmt.bind-param.php

birmarco
07-01-2012, 14:08
Si hai ragione! Ho cannato in pieno :-)
Non è quello il problema allora... Hai già visto gli esempi riportati sulla documentazione?
http://php.net/manual/en/mysqli-stmt.bind-param.php

Quella pagina ho provato a guardarla ma non ci capisco molto. Il codice che ho utilizzato l'ho preso dalla guida di Gutmans sul PHP5 nella parte relativa a MySQL... non credo abbia sbagliato avendo inventato anche lui il linguaggio. Devo essere io che ho sbagliato qualcosa! Ma non riesco a capire cosa.

Il suo esempio è questo:

<?php

$conn = mysqli_connect("localhost", "user", "psw", "database");

$conn->query("CREATE TABLE alfas ". "year INTEGER, model VARCHAR(50), accel REAL)");
$stmt = $conn->prepare("INSERT INTO alfas VALUES(?, ?, ?)");
$stmt->bind_param("isd", $year, $model, $accel);

$year = 2001;
$model = '156 2.0 Selespeed';
$accel = 8.6;
$stmt->execute();

?>

Mettiu_
07-01-2012, 14:19
"Fatal error: Call to a member function bind_param() on a non-object in /membri/bachecaimmobili/pubblica.php on line 83"


Hai provato a controllare il buon esito delle operazioni precedenti con degli if? (in particolare dovresti controllare che prepare() torni qualcosa di sensato). Magari l'oggetto $stmt non arriva correttamente inizializzato alla linea 83 e quando chiami la bind_param() crasha!

birmarco
07-01-2012, 15:32
Hai provato a controllare il buon esito delle operazioni precedenti con degli if? (in particolare dovresti controllare che prepare() torni qualcosa di sensato). Magari l'oggetto $stmt non arriva correttamente inizializzato alla linea 83 e quando chiami la bind_param() crasha!

Ho fatto print $stmt e non mi stampa nulla... ho tolto tutti gli if, il codice parte direttamente dalla connessione al database. Tra l'altro mi stampa l'errore senza che ci sia più nessun print errore. :confused:

birmarco
15-01-2012, 16:57
Ho provato a riguardare 1000 volte, a fare ricerche su internet ma nulla! :(

Qualcuno riesce ad aiutarmi?