problemi con mysqli

paperinik4

Utente Attivo
29 Mag 2011
1.811
0
36
Roma
www.ricetteagogo.it
Salve a tutti,

Ormai si parla tanto di mysqli che sostituirà mysql e sto cercando di adattarmi. Vorrei porre delle domande al riguardo:

1) se il file di connessione chiamato connettimysqli.php si connette al db vuol dire che il mio sistema supporta l'estensione di mysqli o sbaglio ???

2) Una volta si adoperava la seguente stringa:

Codice:
$nuovacitta = mysql_real_escape_string(strtolower(trim ($_POST['nuovacitta'])));

Ora cercando su internet ho provato a sostituirla con la seguente:

Codice:
    $nuovacitta = $mysqli -> mysql_real_escape_string($nuovacitta);

Ma mi da il seguente errore:

Fatal error: Call to a member function mysql_real_escape_string() on a non-object on line 28

La rriga 28 è la seguente:

Codice:
    $nuovacitta = $mysqli -> mysql_real_escape_string($nuovacitta);

Dove sta l'inghippo ???? Perchè nei file di esempio danno istruzioni sballate ????


Inoltre ho l'ultima domanda spero:

3) E' corretto come sintassi ????


Codice:
$sql=$mysqli->query ("INSERT INTO localita (nuovacitta) VALUES ('$nuovacitta')");

Se si perchè non mi scrive niente nel db e mi lascia una riga completamente vuota senza dati ????

E questo è il codice completo se ne aveste bisogno per capire dove sbaglio:


PHP:
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        
<!--<form action="aggiungicitta.php" method="post">-->

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">  
      
<label for="nuovacitta">Nuova città: <input type="text" id="nuovacitta" name="nuovacitta" > </label>

<div align ="center">
    
<input type="submit" name = "submit" value="Aggiungi Città" />
</div>
</form>
        <?php

require_once("connettimysqli.php");
        
  if (!isset($_POST['submit'])) {  
} else {
 #$nuovacitta = mysql_real_escape_string(strtolower(trim ($_POST['nuovacitta'])));

    $nuovacitta = $mysqli -> mysql_real_escape_string($nuovacitta); 
    
#$sql=$mysqli->query ("INSERT INTO localita (nuovacitta) VALUES ('$nuovacitta')");

    echo "Città inserita correttamente.";

 }
    
?>
    </body>
</html>

Se fosse possibile vorrei gestire il tasto submit = invio tutto in un unico file. Spero che qualche buon anima pia mi possa aiutare perchè sono rimasto bloccato. Grazie a tutti.
 
1 - Direi di sì.

2 - Prova sostituendo
PHP:
$nuovacitta = $mysqli->mysql_real_escape_string($nuovacitta);
con
PHP:
$nuovacitta = $mysqli->real_escape_string($nuovacitta);

3 - Prova
PHP:
$sql = $mysqli->query("INSERT INTO localita (nuovacitta) VALUES ('".$nuovacitta."')") or die($mysqli->error);
 
Ciao ballo,

Grazie di avermi risposto. Lunedí quando torno proverò le modifiche da te consigliatemi. Un ultima cosa l'id che dovrebbe gestire l'invio dati, va bene come l'ho messo ???? Grazie.
 
Ciao BayLollo,

Scusami ma essendo dal cellulare mi ha corretto il tuo username. Purtroppo le mdofiche indicatomi da te non gli piacciono e mi continua a dare errore e a non memorizzare i dati. L'errore è il seguente:

Codice:
 Fatal error: Call to a member function real_escape_string()  on line 28

La riga 28 è la seguente:

Codice:
 $nuovacitta = $mysqli->real_escape_string($nuovacitta);

Cosa c'è di sbagliato ????? Inoltre se tolgo la riga 28 mi da errore sulla 30 che sarebbe l'insert, insomma non va e non capisco il perchè è sbagliato la gestione del submit per caso ??? Questo è il listato completo con le modifiche indicatomi da te:


PHP:
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        
<!--<form action="aggiungicitta.php" method="post">-->

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">  
      
<label for="nuovacitta">Nuova città: <input type="text" id="nuovacitta" name="nuovacitta" > </label>

<div align ="center">
    
<input type="submit" name = "submit" value="Aggiungi Città" />
</div>
</form>
        <?php
  if (!isset($_POST['submit'])) {  

require_once("connettimysqli.php");
        
} else {
 #$nuovacitta = mysql_real_escape_string(strtolower(trim ($_POST['nuovacitta'])));

 #$nuovacitta = $mysqli->real_escape_string($nuovacitta);  
 
 $sql = $mysqli->query("INSERT INTO localita (nuovacitta) VALUES ('".$nuovacitta."')") 
         or die($mysqli->error);  
 
 echo "Città inserita correttamente.";

 }
    
?>
    </body>
</html>
 
Ultima modifica:
stavo trafficando anche io con le istruzioni mysqli. Dal codice vedo che una volta hai utilizzato un istruzione mysql, se non sbaglio tutte le istruzioni devono essere mysqli se decidi di utilizzare le nuove istruzioni

Qui perche' usi il simbolo ->? A che scopo?

PHP:
 $nuovacitta = $mysqli->real_escape_string($nuovacitta);
 
Ultima modifica:
PHP:
<?php
if (empty($_POST['submit'])) {  
 die("Compila il form");        
} else {
 include("connettimysqli.php");

 $nuovacitta = $mysqli->real_escape_string($_POST['submit']);

 $sql = $mysqli->query("INSERT INTO localita (nuovacitta) VALUES ('".$nuovacitta."')") 
         or die($mysqli->error);  
 
 echo "Città inserita correttamente.";

 $mysqli->close;
 }
    
?>
Riscritta la parte PHP (da cellulare, tra l'altro)
 
Ciao Antonio,

Si hai ragine deve essere usato tutto mysqli se vuoi mysqli e non fare il miscuglio. Ora ho provato la tua stringa corretta ma mi continua a dare errore. L'errore è il seguente:

Codice:
 Fatal error: Call to a member function real_escape_string() on  line 28

La riga 28 è quella indicata da te e corretta.
 
Ciao BayLollo,

Oggi sto un po' meglio ed ho potuto provare il tuo esempio. ma credo che vada rivisto tutta la programmazione perchè mi da sempre lo stesso errore sulla riga 28:

codice di errore:
Codice:
 Fatal error: Call to a member function real_escape_string() on a non-object in /volume1/web/utenti/moduloiscrizione/provacitta.php on line 28

Riga 28 è la seguente:

Codice:
 $nuovacitta = $mysqli->real_escape_string($_POST['submit']);

Ora considera che io sto facendo pagine web in modo virtuale sul nas = synology che mi permette di fare host web e quindi di programmare tutto in locale. E' come se adoperassi xampp con apache. E dovrebbe essere aggiornato all'ultima versione.
 
Salve a tutti quelli ch emi hanno aiutato e risposto e non solo ahce allo staff,

Allora ho fatto alcune ricerchhe su come si adopera mysqli e finalmente provando vari esempi sono riuscito ad ottenere qualcosa, innanzi tutto è scomparto l'errore:

Codice:
 Fatal error: Call to a member function real_escape_string() on a non-object in /volume1/web/utenti/moduloiscrizione/provacitta.php on line 28

Ed ora per correttezza posto l'intero lista modificato e semi ancora funzionante:

provacitta.php

PHP:
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        
<!--<form action="aggiungicitta.php" method="post">-->

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">  
      
<label for="nuovacitta">Nuova città: <input type="text" id="nuovacitta" name="nuovacitta" > </label>

<div align ="center">
    
<input type="submit" name = "submit" value="Aggiungi Città" />
</div>
</form>
        <?php
if (!isset($_POST['submit'])) {  

require_once("connettimysqli.php");

        
//Questa è la nuova sintassi con mysqli funzionante senza alcun erroree per mysql_real_escape_string 
// a --> mysqli_real_escape_string

$nuovacitta = mysqli_real_escape_string($con, trim($_POST["nuovacitta"]));
 

#if (!$con->query("INSERT into localita (nuovacitta) VALUES ('$nuovacitta')")) {
   // echo "errore nell'nserimento dati";

// L'inserimento è corretto o meglio la sintassi con mysqli è corretta ma nel db si vedono solo righe vuote
mysqli_query($con, "INSERT INTO localita (`nuovacitta`) VALUES ('$nuovacitta')");

 echo "Città inserita correttamente.";
} else {
 }  //chiude l'else verifica inserimento 
 
 # } // chiude l'if per l'isnerimento dati
?>
    </body>
</html>

Credo che meriti un po' di spiegazini. La sintassi corretta per lo meno dagli esempi che ho potuto provare per far sparire quell'errore era la seguente:

vecchie modifiche consigliate da voi:

Codice:
 $nuovacitta = $mysqli->real_escape_string($nuovacitta);

Modificato così:

Codice:
$nuovacitta = mysqli_real_escape_string($con, trim($_POST["nuovacitta"]));

per BayLollo c'eri andato molto vicino.

Poi l'altro cruccio era l'inserimento sempre mysqli. Il consiglio precedente era:

Codice:
 $sql = $mysqli->query("INSERT INTO localita (nuovacitta) VALUES ('".$nuovacitta."')") or die($mysqli->error);

Quello che dovrebbe essere esatto (dico dovrebbe) perchè dopo vi spiego il motivo è questo:

Codice:
mysqli_query($con, "INSERT INTO localita (`nuovacitta`) VALUES ('$nuovacitta')");

Per BayLollo: anche qui eri andato molto vicino alla soluzione. Il punto ora è che mi compaiono nel db righe completamente vuote. Qua mi ci vorrebbe il vostro aiuto perchè da solo non sono riuscito ad ottenere alcun risultato. Spero di non aver offeso nessuno e di ricevere disponibilità da parte di tutti voi. Inoltre mi volevo complimentare con lo staff perhcè è un sito veramente straordinario continuate così e non arrendetevi.

P.S.: Si riuscirà a capire dove sbaglio avendo le sintassi corrette. In ultimo vorrei specificare che non so se adopere il procedurale o orientato agli oggetti negli esempi none rano specificati. Grazie a tutti.
 
Hai, in realtà, convertito dal metodo orientato verso gli objects (es. $mysqli->query()) al metodo procedurale (es. mysqli_query()).
Mi viene da pensare, vedendo finalmente l'errore completo, che tu non abbia definito la variable "mysqli" nel "connettimysqli.php". È così?

Non capisco in realtà a cosa serva "if (!isset($_POST['sumbit']))", che dovrebbe avere il valore di "se il pulsante per trasmettere i dati non è settato" e a cosa serva "else {}".
Anche "echo 'Città inserita correttamente.'" non è il massimo, visto che non fai un controllo a mysqli_query().
 
E secondo te copme si potrebbe correggere per passare al metodo orientato agli ogetti ????

Questo è il connettimysqli.php

PHP:
<?php
   

$host     = 'nas';
$user     = 'fabio';
$password = 'xxxxxxxxxxxx';
$db     = 'MegaLaboratorio';


/*$con= new mysqli($host, $user, $password, $db); */

 $con=mysqli_connect($host, $user, $password, $db);  
// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$mysqli_db_selected = mysqli_select_db($con, $db);
if (!$mysqli_db_selected) {
	die ("Errore nella selezione del database: " . mysqli_connect_errno());
}
else
      {
         
    echo'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
    

echo"</h1>";


      }
 
mysqli_connection.php
PHP:
<?php
$host = "nas";
$user = "fabio";
$password = "x";
$db = "MegaLaboratorio";
$mysqli = new mysqli($host, $user, $pass, $db);

if ($mysqli->connect_error) {
    die('Errore di connessione: ' . $mysqli->connect_errno);
}
?>

provacitta.php
PHP:
<html>
<head>
<meta charset="UTF-8">
<title>Prova</title>
</head>

<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">     
	<label for="nuovacitta">Nuova città: <input type="text" id="nuovacitta" name="nuovacitta" /></label>
	<div align ="center">
		<button>Aggiungi Città</button>
	</div>
</form>

<?php
if(isset($_POST['nuovacitta'])) {
	include("mysqli_connection.php");
	$nuovacitta = $mysqli->real_escape_string($_POST['nuovacitta']);
	if ($mysqli->query("INSERT INTO `localita` VALUES ('$nuovacitta')") === TRUE) {
		echo "Città inserita correttamente.";
	} else {
		die($mysqli->error);
	}
}
?>
</body>
</html>
 
Ciao BayLollo,


Finalmente abbiamo partorito. Era leggermente sbagliato il mio connettimysqli.php. L'ho modificato con le tue nuove modifiche e ho modificato anche l'inserimento dei dati da te suggeritomi ed ora funziona tutto alla grande. Perdonami ma se non erro questo è il metodo "orientato ad ogetti" giusto ???? Ho dovuto fare una modifica alla parte di insert in quando mi dava errore come se la colonna 1 non esistesse nel db. L'errore che mi dava era il seguente per l'esatezza:

Originariamente l'insert me l'avevi fatto in questo modo:

Codice:
if ($mysqli->query("INSERT INTO `localita` VALUES ('$nuovacitta')") === TRUE) {


Codice:
Column count doesn't match value count at row 1

Io l'ho modificato in quest'altro modo:

Codice:
    if ($mysqli->query("INSERT INTO `localita` (nuovacitta) VALUES ('$nuovacitta')") === TRUE) {

In questa maniera ho tolto l'errore e non solo mi scrive anche la città che inserisco nel db. Per radesso ti ringrazio. Ma spero che mi potrai aiutare a modificare anche un'altro paio di cose che una volta si facevano abbastanza tranquilamente con mysql. Ossia while e fetch modificate in mysqli. Ma prima voglio fare una ricerca per vedere se trovo difficoltà. Grazie.
 
Ciao BayLollo,


Rimanendo sempre in tema, io vorrei cercare di fare una cosa del genere. cerco di spiegarmi e spero che tu mi possa aiutare. Ho una tabella chiamata località che contiene i seguenti campi:

Tabella localita

Codice:
CREATE TABLE localita(

id 		INT UNSIGNED NOT NULL AUTO_INCREMENT ,
nazione 		VARCHAR( 30 ) NOT NULL ,
nuovanazione	VARCHAR( 30 ) NOT NULL ,
citta 		VARCHAR( 30 ) NOT NULL ,
nuovacitta		VARCHAR( 30 ) NOT NULL ,
provincia 		VARCHAR( 2 ) NOT NULL ,
nuovaprovincia	VARCHAR( 2 ) NOT NULL ,
PRIMARY KEY ( id )
)

In pratica vorrei ottenere che quando uno si iscrive se c'è la sua città compare una select se invece non è presente alcuna città compare il campo input. In un vecchio programma c'ero riuscito a fare una cosa simile ma per un'altra cosa e tutto in mysql invece ora bisognerebbe fare tutto in mysqli e alcune funzioni purtroppo non sono ben documentate e molti esempi nemmeno si trovano. Questo è quello che mi hanno aiutato ad ottenere:

Codice:
<?php
$q=mysql_query("SELECT descrizione FROM tblcategoria ORDER BY descrizione");
$vuota=mysql_num_rows($q);
if($vuota > 0){//fa vedere la select solo se ci sono categorie e mostra solo il'input nuovacategoria, in pratica solo la prima volta
	echo "Categoria: <select name=\"categoria\">";
		echo "<option value=\"\">-seleziona-</option>";
	while($riga=mysql_fetch_array($q)){
		echo "<option value=\"".$riga['descrizione']."\">".$riga['descrizione']."</option>";
	}//fine while
echo "</select> ";
}//fine if vuota

?>
	Nuova categoria da inserire: <input type='text' name='nuovacategoria'>
<?php
$q=mysql_query("SELECT descrizione FROM tblcomponenti ORDER BY descrizione");
$vuota=mysql_num_rows($q);
if($vuota > 0){//fa vedere la select solo se ci sono componenti e mostra solo il'input nuovocomponente, in pratica solo la prima volta
	echo "Componente: <select name=\"componente\">";
		echo "<option value=\"\">-seleziona-</option>";
	while($riga=mysql_fetch_array($q)){
		echo "<option value=\"".$riga['descrizione']."\">".$riga['descrizione']."</option>";
	}//fine while
echo "</select>";
}//fine if vuota
?>
	Nuovo componente da inserire: <input type='text' name='nuovocomponente' />

}else{
    $rivista = mysql_real_escape_string(strtolower(trim ($_POST['rivista'])));
	$anno =mysql_real_escape_string(strtolower(trim ($_POST['anno'])));
	$numero =mysql_real_escape_string(strtolower(trim ($_POST['numero'])));
	$pagina =mysql_real_escape_string(strtolower(trim ($_POST['pagina'])));
	$titolo = mysql_real_escape_string(strtolower(trim ($_POST['titolo'])));
	$fbcategoria =mysql_real_escape_string(strtolower(trim ($_POST['categoria'])));
	$fbcategoria_nuova = mysql_real_escape_string(strtolower(trim ($_POST['nuovacategoria'])));
	$componenti = mysql_real_escape_string(strtolower(trim ($_POST['componente'])));
	$componenti_nuovo = mysql_real_escape_string(strtolower(trim ($_POST['nuovocomponente'])));

if($fbcategoria=="" && $fbcategoria_nuova !=""){//sto cercasndo di inserire una nuova categoria
		$q_cat=mysql_query("SELECT descrizione FROM tblcategoria WHERE descrizione='$fbcategoria_nuova'");
		$esiste=mysql_num_rows($q_cat);
		if($esiste==0){//non esiste quindi l'aggiungo
			$q_i=mysql_query("INSERT INTO tblcategoria(descrizione) VALUES('$fbcategoria_nuova')");
			$fbcategoria=$fbcategoria_nuova;//questo è il valore che andro ad inesrire nella tabella tblrivista
         }else{//se esiste  vuol dire che hai messo nel campo un valore che era nella selecct del form quindi
			$fbcategoria=$fbcategoria_nuova;//questo è il valore che andro ad inesrire nella tabella tblrivista
		}
	}
	//componente
	if($componenti=="" && $componenti_nuovo !=""){//sto cercasndo di inserire una nuova categoria
		$q_com=mysql_query("SELECT descrizione FROM tblcomponenti WHERE descrizione='$componenti_nuovo'");
		$esiste=mysql_num_rows($q_com);
		if($esiste==0){//non esiste quindi l'aggiungo
			$q_i=mysql_query("INSERT INTO tblcomponenti(descrizione) VALUES('$componenti_nuovo')");
			$componenti=$componenti_nuovo;//questo è il valore che andro ad inesrire nella tabella tblrivista
         }else{//se esiste  vuol dire che hai messo nel campo un valore che era nella selecct del form quindi
			$componenti=$componenti_nuovo;//questo è il valore che andro ad inesrire nella tabella tblrivista
		}
	}

Questo è ciò che ho ottenuto grazie all'aiuto di una persona. ora lo dovrei trasformare per la località. E' un po' complesso ma penso che ci si possa riuscire. Tu mi sapresti dare una mano ????
 
Salve a tutti,

ho iniziato ad apportare alcune modifiche ma non so il perchè mi salta il controllo. Spiego prima quello che dovrebbe fare. In sostanza se l'utente digita una città, e preme "aggiungi", gli dovrebbe indicare se esiste nel db o meno se esiste poi dovrà apparire la select per selezionarla dallì. Tutto questo ho cercato con molta fatica di farlo con mysqli. Questo è il risultato:

provacitta.php

PHP:
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        
<!--<form action="aggiungicitta.php" method="post">-->
    
<form action="" method="post">

<label for="nuovacitta">Nuova città: <input type="text" id="nuovacitta" name="nuovacitta" > </label>

    
<div align ="center">
    
<input type="submit" name="submit" value="Aggiungi" />


</div>
</form>
<?php
include("connettimysqli.php");

if(isset($_POST['submit'])) {

    $checkcitta=$mysqli->query("SELECT citta FROM localita WHERE nuovacitta='$nuovacitta' ORDER BY citta");
    
    $row_cnt = $checkcittat->num_rows;
    
    if ($row_cnt > 0) {
    echo "<h1>ALa citta è presente nel db. Adoperare la select per selezionarla</h1>";
}else{
     
    
    $nuovacitta = $mysqli->real_escape_string($_POST['nuovacitta']);
    

    if ($mysqli->query("INSERT INTO `localita` (nuovacitta) VALUES ('$nuovacitta')") === TRUE) {
        echo "Città inserita correttamente.";
    } else {
        die($mysqli->error);
    }
} 
}

perchè mi salta la query ???? Spero che qualcuno mi possa aiutare grazie.
 

Discussioni simili