Capisco, mi dispiace.
È vero, siamo andati un po' OT. Me ne sono accorto ieri ma penso che ne valga la pena per discussioni più o meno costruttive, specialmente in questo caso dove si scontrano (incontrano?) punti di vista differenti.
Il forum è un posto per imparare. Penso che più dell'80% di cose che so (e che ho dimenticato) le ho imparate qui in questo forum. Senza scambi di opinioni si rischia di rimanere nella propria strada senza vedere altri problemi/punti di vista. Io la trovo una cosa bella, non so perché voi ci vedete astio e competizione; forse è il mio modo di esprimermi o forse il suo o di entrambi che rende questa idea.
Il discorso di fractalcosmo è condivisibile, anzi approvo: mi è capitato di recente di fare un sito e la logica (PHP) non si trova nel file dedicato all'html. Però il file html è comunque PHP per poterci scrivere dinamicamente i contenuti; non capisco come fare in un file PHP se non usando soltanto javascript+ajax (discorso già affrontato e conosciamo entrambi i nostri differenti punti di vista).
Tornando invece IT io son ancora lì sulla documentazione. Provo a spiegarti le cose fondamentali poi vedi tu/dimmi tu dove trovi difficoltà: prendiamo come riferimento mysqli_query().
Tralasciando la versione ad oggetti (Object oriented style), soffermiamoci sulla procedurale (Procedural style):
Una delle principali cose da guardare è il prototipo della funzione:
mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
Da questa riga si capisce:
- mixed: Questo è il tipo del dato ritornato dalla funzione. Quando fai
Codice PHP:
$variabile=funzione();
il tipo di dati in $variabile corrisponde a quello che ritorna la funzione. Mixed significa che in realtà non è un tipo specifico, ma può essere un numero, una stringa, un array: nella nostra funzione presa in esame, guardando più sotto viene spiegato più in dettaglio cosa ritorna la funzione (Return Values):
Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.
Quindi ritorna FALSE se la query fallisce. Per query di tipo SELECT, SHOW, DESCRIBE e EXPLAIN ritorna un oggetto mysqli_result dove, cliccandoci, puoi vedere tutte le funzioni che puoi utilizzare (in realtà vengono indicati le proprietà e i metodi utilizzati per la programmazione ad oggetti, ma cliccando in ogniuno specifico viene indicata anche la rispettiva procedurale). La funzione altrimenti ritorna TRUE per le altre query (INSERT, DELETE, ...) se effettuate con successo. Infatti nel tuo codice vai proprio a vedere se ritorna TRUE o FALSE:
Codice PHP:
if($result)
[...]
- mysqli_query questo è il nome della funzione. Non credo ci sia da dir molto.
- Dentro le parentesi tonde, il primo parametro è mysqli $link: questo indica che il parametro deve essere di tipo mysqli. Stesso discorso di prima: anche qui puoi cliccarci e vedere tutti i metodi/proprietà e le rispettive funzioni in procedurale come spiegato sopra. Dal nome $link si capisce (o almeno si dovrebbe capire) che si tratta della connessione del database; nel tuo caso $con. Infatti se guardi, $con l'hai generata grazie alla mysqli_connect() che come vedi ritorna proprio un dato di tipo mysqli.
- Il secondo parametro è string $query. Penso ci sia ben poco da spiegare qui: il tipo deve essere una stringa e i già il nome del parametro fa intendere bene cosa si aspetta la funzione.
- L'ultimo parametro [, int $resultmode = MYSQLI_STORE_RESULT ] indica che si aspetta un intero (int). Il fatto che sia tra parentesi quadre significa che è opzionale, ovvero puoi non specificarlo. Se non viene specificato di default viene passato il valore MYSQLI_STORE_RESULT. Direi per ora di non soffermarci sul significato di questa cosa.
Tutto questo discorso in realtà è fatto già dalla documentazione, nella voce "Parameters". In inglese, ma è spiegato chiaramente credo anche per chi non è molto ferrato in quella lingua.
Più sotto ci sono gli esempi. Prima quello ad oggetti poi il procedurale. L'esempio è la botta finale che dovrebbe chiarire ogni dubbio. È praticamente il codice che ti ha scritto fractalcosmo (ok, non proprio identico ma rende bene l'idea di come usar la funzione):
Codice PHP:
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Create table doesn't return a resultset */
if (mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) {
printf("Table myCity successfully created.\n");
}
/* Select queries return a resultset */
if ($result = mysqli_query($link, "SELECT Name FROM City LIMIT 10")) {
printf("Select returned %d rows.\n", mysqli_num_rows($result));
/* free result set */
mysqli_free_result($result);
}
/* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */
if ($result = mysqli_query($link, "SELECT * FROM City", MYSQLI_USE_RESULT)) {
/* Note, that we can't execute any functions which interact with the
server until result set was closed. All calls will return an
'out of sync' error */
if (!mysqli_query($link, "SET @a:='this will not work'")) {
printf("Error: %s\n", mysqli_error($link));
}
mysqli_free_result($result);
}
mysqli_close($link);
?>
Ora, qual è il problema che incontri? Dove trovi difficoltà?
EDIT:
Ho visto solo adesso il problema del charset.
Non mi piace troppo il fatto di convertire i vari charset. Dovresti cercare di usarne uno e usar sempre quello senza mai modificarlo.
I dati "in arrivo" sono codificati con la codifica della pagina HTML, quindi direi UTF-8. Un modo più elegante del "<meta charset>" per impostare il charset è impostarlo nell'header della richiesta, ovvero:
Codice PHP:
header('Content-Type: text/html; charset=utf-8');
Per il database, dovrebbe essere sufficiente quanto ti ho scritto nella risposta in questa discussione.
L'esempio di riferimento del manuale per la funzione mysqli_set_charset() è:
Codice PHP:
<?php
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
printf("Initial character set: %s\n", mysqli_character_set_name($link));
/* change character set to utf8 */
if (!mysqli_set_charset($link, "utf8")) {
printf("Error loading character set utf8: %s\n", mysqli_error($link));
exit();
} else {
printf("Current character set: %s\n", mysqli_character_set_name($link));
}
mysqli_close($link);
?>
Usa addirittura utf8!
----------
Hai detto che hai fatto la prova con "che c'è". In questo caso non si tratta soltanto di charset. Hai usato un apice singolo e questo per farlo funzionare occorre effettuare l'escape.
Codice PHP:
$nome = trim($_POST['nome']);
$cognome = trim($_POST['cognome']);
Oltre a trim(), andrebbe usata quindi la mysqli_real_escape_string() per risolvere il problema.
Codice PHP:
$nome = mysqli_real_escape_string($con, trim($_POST['nome']));
$cognome = mysqli_real_escape_string($con, trim($_POST['cognome']));
Ciao!