PDA

View Full Version : [PHP] Problemi con MySQL


birmarco
26-01-2012, 21:33
Ciao a tutti!

Ho un problema a far interagire PHP con MySQL. Il codice è questo:

$conn = mysqli_connect("localhost", "db_name", "psw", "***");
$stmt = $conn->prepare("INSERT INTO A(Titolo, Contatto, Descrizione) VALUES(?, ?, ?)");

$contatto = "Prova";
$title = $_POST['titolo'];
$descr = $_POST['descrizione'];

$stmt->bind_param("sss", $title, $contatto, $descr);
$stmt->execute();

I dati li prende da un form, quando faccio submit mi dà questo errore:

Fatal error: Call to a member function bind_param() on a non-object on line 88

Che sarebbe la linea di bind_param. I parametri vengono prelevati correttamente dal form, ho già controllato. Purtroppo rimango inchiodato qui.

PS. Ovviamente i dati di accesso al DB non sono quelli, li ho solo oscurati ;)

Gimli[2BV!2B]
26-01-2012, 23:29
$stmt non è un oggetto, probabilmente è null o giù di lì.
Questo implica che $conn->prepare sia fallita.
Il prepare viene però processato, quindi $conn è valida.

Controlla con cura l'SQL, è estremamente probabile che ci sia un errorino nei nomi dei campi o nel nome della tabella stessa.

birmarco
27-01-2012, 09:10
;36808390']$stmt non è un oggetto, probabilmente è null o giù di lì.
Questo implica che $conn->prepare sia fallita.
Il prepare viene però processato, quindi $conn è valida.

Controlla con cura l'SQL, è estremamente probabile che ci sia un errorino nei nomi dei campi o nel nome della tabella stessa.

Grazie! Ho fatto un po' di controlli, in realtà è un sacco che ci sbatto contro a questa cosa ma non ne vengo a capo. Ho provato in mile maniere diverse ma non capisco!

I campi hanno il nome corretto, idem per la tabella. Ho provato anche a fare una select ma non funziona neanche quella:

$conn = mysqli_connect("localhost", "****", "****", "****");
$stmt = $conn->prepare("SELECT Titolo, Contatto, Descrizione FROM a");
$stmt->execute();

$stmt->bind_result($A, $B, $C);
print $A;
print $B;
print $C;

Mi dà errore sempre sulla bind! :(

Cmq l'errore è sicuramente in prepare quindi? Anche se a me sembra tutto corretto. Se eseguo quelle query in sql direttamente sul database funzionano perfettamente.... :confused:

Mettiu_
27-01-2012, 14:23
Scusa ma come fa a darti lo stesso errore?? Nel primo codice l'errore era sulla chiamata a bind_param(). Ma nell'ultimo codice che hai postato non c'è nessuna bind_param() quindi di sicuro il messaggio di errore deve quantomeno essere diverso... :confused:
Tra l'altro, dopo la bind_result() e prima delle print dovresti chiamare $stmt->fetch() altrimenti le tre variabili A, B e C rimangono vuote...

birmarco
27-01-2012, 16:49
Scusa ma come fa a darti lo stesso errore?? Nel primo codice l'errore era sulla chiamata a bind_param(). Ma nell'ultimo codice che hai postato non c'è nessuna bind_param() quindi di sicuro il messaggio di errore deve quantomeno essere diverso... :confused:
Tra l'altro, dopo la bind_result() e prima delle print dovresti chiamare $stmt->fetch() altrimenti le tre variabili A, B e C rimangono vuote...

Si, hai ragione! :) :) Infatti come dici tu funziona tutto perfettamente. Avevo dimenticato di inserire stmt fetch. ;) Cmq l'errore era diverso, sempre sulla bind, ma quell'altra. La bind result

Per l'inserimento valori ancora niente però :(
Quali sono i possibili problemi? Così controllo uno per uno

Mettiu_
27-01-2012, 17:14
Torniamo al codice di partenza...
Comincia a cambiare il codice in questo modo e vediamo cosa ti viene fuori:

$conn = mysqli_connect("localhost", "db_name", "psw", "***");
$stmt = $conn->prepare("INSERT INTO A(Titolo, Contatto, Descrizione) VALUES(?, ?, ?)");
if(!$stmt)
{
printf("Errormessage: %s\n", $mysqli->error);
}
else
{
$contatto = "Prova";
$title = $_POST['titolo'];
$descr = $_POST['descrizione'];

$stmt->bind_param("sss", $title, $contatto, $descr);
$stmt->execute();
//. . . bla bla bla bla
}
$conn->close();
Così almeno cerchiamo di capire perchè la prepare() fallisce...

P.S. Diamo per buono che la connect non fallisca...

birmarco
28-01-2012, 15:15
Torniamo al codice di partenza...
Comincia a cambiare il codice in questo modo e vediamo cosa ti viene fuori:

$conn = mysqli_connect("localhost", "db_name", "psw", "***");
$stmt = $conn->prepare("INSERT INTO A(Titolo, Contatto, Descrizione) VALUES(?, ?, ?)");
if(!$stmt)
{
printf("Errormessage: %s\n", $mysqli->error);
}
else
{
$contatto = "Prova";
$title = $_POST['titolo'];
$descr = $_POST['descrizione'];

$stmt->bind_param("sss", $title, $contatto, $descr);
$stmt->execute();
//. . . bla bla bla bla
}
$conn->close();
Così almeno cerchiamo di capire perchè la prepare() fallisce...

P.S. Diamo per buono che la connect non fallisca...

Sono riuscito a risolvere! :) Il problema era nel database! Io ho convigurato la base di dati da workbench sul PC e poi ho caricato il dump sul server dell'host. Peccato che con il caricamento mi abbia cambiato i nomi delle tabelle mettendo tutto minuscolo. Io mi basavo sui nomi che avevo dato in workbench quando invece sull'host erano diversi! :doh: L'ho scoperto così per caso quando sono andato su phpmyadmin a provare alcune query :mad: Però non dovrebbe cambiarti i nomi così di testa sua perchè altrimenti uno fa un lavoro e poi le cose non gli funzionano più e non capisce perchè! :mad:

Grazie a tutti dell'aiuto!

Mettiu_
28-01-2012, 15:28
Mai sentita una roba del genere :confused:
Vabbè l'importante è che hai risolto :D

birmarco
28-01-2012, 17:58
Mai sentita una roba del genere :confused:
Vabbè l'importante è che hai risolto :D

Già... per quello che impazzivo!! Chi andrebbe mai a pensare una cosa così... :rolleyes: Ora però ho finalmente risolto... impazzivo! :D