Porting mysql a mysqli

elpirata

Utente Attivo
18 Mar 2009
257
7
18
Un saluto a tutta la community,
mi dareste una mano a sistemare questo codice per effettuare il porting da mysql a mysqli.

Questo il file della connessione che funziona bene:

PHP:
<?php
// Apriamo la connessione verso il database mysql
$conndb = mysqli_connect('localhost', 'utente', 'password', 'database');

// Controlliamo l'esito della connessione
if (!$conndb) {
    die("Errore di connessione (" . mysqli_connect_errno() . ") " . mysqli_connect_error());
    exit();
}

// Chiudiamo la connessione
    mysqli_close($conndb);

?>
questo il codice che invece dovrei trasformare da mysql a mysqli

PHP:
<?php
include('conngo2.php'); // Includes Login Script

if($_POST) {
    effettua_login();
} else {
    mostra_form();
}

function mostra_form()
{
    // mostro un eventuale messaggio
    if(isset($_GET['msg'])) {
        echo '<b>'.htmlentities($_GET['msg']).'</b><br /><br />';
    }
    ?>

    <!DOCTYPE html>
<html >
 
  <head>
    <meta charset="UTF-8">
    <title>Porting</title>
    <link rel="icon" href="favicon.ico">
    <link rel="stylesheet" href="css/style.css">
    <script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
    <script src="js/index.js"></script>
  </head>

    <body>

    <div class="wrapper">
    <div class="container">
        <h1>Porting</h1>
        <form id="form_login" name = "form_login" "class="form" method="post" action="">
            <input type="text" placeholder="Username" name="username">
            <input type="password" placeholder="Password" name="password">
            <button type="submit" id="login-button">Accedi</button>
        </form>
    </div>
    
    <ul class="bg-bubbles">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>
  
    </body>
</html>

    <?
}

function effettua_login()
{
    // recupero il nome e la password inseriti dall'utente
    $username      = trim($_POST['username']);
    $password         = trim($_POST['password']);
    
    // verifico se devo eliminare gli slash inseriti automaticamente da PHP
    if(get_magic_quotes_gpc()) {
        $username     = stripslashes($username);
        $password      = stripslashes($password);
    }

    // verifico la presenza dei campi obbligatori
    if(!$username || !$password) {
        $messaggio = urlencode("Non hai inserito il nome o la password");
        header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
        exit;
    }
    // effettuo l'escape dei caratteri speciali per inserirli all'interno della query
    $username    = mysql_real_escape_string($username);
    $password     = mysql_real_escape_string($password);   

    // preparo ed invio la query
    $query = "SELECT * FROM utenti WHERE username = '$username' AND password = MD5('$password')";
    $result = mysql_query($query);
    
    // controllo l'esito
    if (!$result) {
        die("Errore nella query $query: " . mysql_error());
    }

    $record = mysql_fetch_array($result);

    if(!$record) {
        $messaggio = urlencode('Nome utente o password errati');
        header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
        
    } else {
        session_start();
        $_SESSION['username'] = $record['username'];
        $messaggio = urlencode('Login avvenuto con successo');
        header("location: home.php");
}
}
?>

Sono arrivato a questo punto, ma ottengo sempre un errore nella query;

PHP:
<?php

include('conngo2.php'); // Includes Login Script

if($_POST) {
    effettua_login();
} else {
    mostra_form();
}

function mostra_form()
{
    // mostro un eventuale messaggio
    if(isset($_GET['msg'])) {
        echo '<b>'.htmlentities($_GET['msg']).'</b><br /><br />';
    }
    ?>

    <!DOCTYPE html>
<html >
 
  <head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="icon" href="favicon.ico">
    <link rel="stylesheet" href="css/style.css">
    <script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
    <script src="js/index.js"></script>
  </head>

    <body>

    <div class="wrapper">
    <div class="container">
        <h1></h1>
        <form id="form_login" name = "form_login" "class="form" method="post" action="">
            <input type="text" placeholder="Username" name="username">
            <input type="password" placeholder="Password" name="password">
            <button type="submit" id="login-button">Accedi</button>
        </form>
    </div>
    
    <ul class="bg-bubbles">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>
  
    </body>
</html>

    <?
}

function effettua_login()
{
    

    // recupero il nome e la password inseriti dall'utente
    $username      = trim($_POST['username']);
    $password         = trim($_POST['password']);
    
    // verifico se devo eliminare gli slash inseriti automaticamente da PHP
    if(get_magic_quotes_gpc()) {
        $username          = stripslashes($username);
        $password          = stripslashes($password);
    }

    // verifico la presenza dei campi obbligatori
    if(!$username || !$password) {
        $messaggio = urlencode("Non hai inserito il nome o la password");
        header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
        exit;
    }
    // effettuo l'escape dei caratteri speciali per inserirli all'interno della query
    $username         = mysqli_real_escape_string($conndb, $username);
    $password         = mysqli_real_escape_string($conndb, $password);

    // preparo ed invio la query
    $query = "SELECT * FROM utenti WHERE username = '$username' AND password = MD5('$password')";
    $result = mysqli_query($conndb,$query);
    // print_r($conndb,$result);
    
    // controllo l'esito
    if (!$result) {
        die("Query:  " .$query. " <br>Errore: " . mysql_error($conndb));
    }

    $record = mysqli_fetch_array($conndb,$result);
    mysqli_free_result($result);

    if(!$record) {
        $messaggio = urlencode('Nome utente o password errati');
        header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
        
    } else {
        session_start();
        $_SESSION['username'] = $record['username'];
        $messaggio = urlencode('Login avvenuto con successo');
        header("location: home.php");
}
}
?>
Dopo una serie di verifiche, il problema sembrerebbe risiedere nella funzione mysqli_real_escape_string

Codice:
// recupero il nome e la password inseriti dall'utente
    $username      = trim($_POST['username']);
    $password      = trim($_POST['password']);
    //OK print_r ($username);
    //OK print_r ($password);
    
    
    // verifico se devo eliminare gli slash inseriti automaticamente da PHP
    if(get_magic_quotes_gpc()) {
        $username          = stripslashes($username);
        $password      = stripslashes($password);
    }
    //OK print_r ($username);
    //OK print_r ($password);
    

    // verifico la presenza dei campi obbligatori
    if(!$username || !$password) {
        $messaggio = urlencode("Non hai inserito il nome o la password");
        header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
        exit;
    }
    //OK print_r ($username);
    //OK print_r ($password);
    
    // effettuo l'escape dei caratteri speciali per inserirli all'interno della query
    $username         = mysqli_real_escape_string($conndb,$username);
    $password     = mysqli_real_escape_string($conndb,$password);
    [b]// KO VARIABILE NON VALORIZZATA[/b] print_r ($username);
    [b]// KO VARIABILE NON VALORIZZATA[/b] print_r ($password);
mi dareste una mano, devo migrare circa 50 script da mysql a mysqli

Grazie
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
per passare a mysqli devi per prima cosa modificare il file della connessione, esempio
PHP:
<?php
//---variabili di connessione----------------------------------------
$host = 'nome_host';     //nome host, localhost se in locale
$username = 'tuo_username';      //user name
$password = 'tua_password';  //password
$db = 'tuo:database';            // nome data base
//---connessione----------------------------------------------------
$conn = mysqli_connect($host,$username,$password, $db) or die (mysql_error());
?>
attento a come chiami la variabile $conn, ti servirà nelle query
poi nelle varie query devi modificare
PHP:
//connessione con il require o scritta in loco
$ris=mysqli_query($conn, "SELECT * FROM tabella");//analogo per l'UPDATE e DELETE
//...
per le altre funzioni metti una i in piu, es
mymsql_fetch_assoc correggi in mysqli_fetch_assoc
questo per semplificare, oppure correggi tutto passando alla programmazione ad oggetti

p.s.
nel richiamare il file di connessione è meglio usare require_once, es.
PHP:
//....
require_once "connessione.php";
//.....
 

elpirata

Utente Attivo
18 Mar 2009
257
7
18
Ciao borgoitalia e grazie per la risposta,
ho seguito step by step il tuo consiglio per la connessione al db ed essa viene correttamente instaurata...

ho dubbi su questa parte del codice:

PHP:
function effettua_login()
{
    
    require_once "conngo2.php";// Includes Login Script
    //global $conndb;
    
    // recupero il nome e la password inseriti dall'utente
    $username      = trim($_POST['username']);
    $password         = trim($_POST['password']);
    //OK print_r ($username);
    //OK print_r ($password);
    
    
    // verifico se devo eliminare gli slash inseriti automaticamente da PHP
    if(get_magic_quotes_gpc()) {
        $username          = stripslashes($username);
        $password          = stripslashes($password);
    }
    //OK print_r ($username);
    //OK print_r ($password);
    

    // verifico la presenza dei campi obbligatori
    if(!$username || !$password) {
        $messaggio = urlencode("Non hai inserito il nome o la password");
        header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
        exit;
    }
    //OK print_r ($username);
    //OK print_r ($password);
    
    // effettuo l'escape dei caratteri speciali per inserirli all'interno della query
    $username         = mysqli_real_escape_string($conndb,$username);
    $password         = mysqli_real_escape_string($conndb,$password);
    

    // preparo ed invio la query
    $query = "SELECT * FROM utenti WHERE username = '$username' AND password = MD5('$password')";
    $result = mysqli_query($conndb,$query);
    //var_dump($result);
la variabile della connessione si chiama $conndb
 

elpirata

Utente Attivo
18 Mar 2009
257
7
18
Buongiorno a tutti,
innanzitutto mi scuso con borgoitalia, adesso il codice precedentemente segnalato funziona, il problema era la cache di firefox che non mi permetteva di visualizzare le modifiche aggiornate.

Grazie Mille
 

elpirata

Utente Attivo
18 Mar 2009
257
7
18
Buongiorno, continuo la mia migrazione vs mysqli,
non riesco più a recuperare l'id dell'ultima commessa inserita...:(

PHP:
<?php
require_once "conngo2.php";

// RECUPERO TUTTI I CAMPI POST DEL FORM E FACCIO L'ESCAPE E L'UPPER DEI CARATTERI
foreach ($_POST as $key => $value) {
    ${$key} = mysqli_real_escape_string(strtoupper($value));
}

// QUERY DI INSERIMENTO SENZA UPPER, L'UPPER E' DEMANDATO AL COMANDO FOREACH
$sql = "INSERT INTO `CommesseOfficina` (`veicolo`,`targa`,`km`,`telaio`,`cliente`,`indirizzo`,`piva`,`tel`,`itr1`,`itr2`,`itr3`,`itr4`,`itr5`,`itr6`,`itr7`,`itr8`,`itr9`,`itr10`,`itr11`,`itr12`,`itr13`,`itr14`,`itr15`,`for1`,`for2`,`for3`,`for4`,`for5`,`for6`,`for7`,`for8`,`for9`,`for10`,`for11`,`for12`,`for13`,`for14`,`for15`,`q1`,`q2`,`q3`,`q4`,`q5`,`q6`,`q7`,`q8`,`q9`,`q10`,`q11`,`q12`,`q13`,`q14`,`q15`,`iu1`,`iu2`,`iu3`,`iu4`,`iu5`,`iu6`,`iu7`,`iu8`,`iu9`,`iu10`,`iu11`,`iu12`,`iu13`,`iu14`,`iu15`,`sc1`,`sc2`,`sc3`,`sc4`,`sc5`,`sc6`,`sc7`,`sc8`,`sc9`,`sc10`,`sc11`,`sc12`,`sc13`,`sc14`,`sc15`,`imp_1`,`imp_2`,`imp_3`,`imp_4`,`imp_5`,`imp_6`,`imp_7`,`imp_8`,`imp_9`,`imp_10`,`imp_11`,`imp_12`,`imp_13`,`imp_14`,`imp_15`,`totale`,`n_tecnico`,`pagamento`,`data`,`allegato`)
VALUES
(('$veicolo'),('$targa'),'$km',('$telaio'),('$cliente'),('$indirizzo'),'$piva','$tel',('$itr1'),('$itr2'),('$itr3'),('$itr4'),('$itr5'),('$itr6'),('$itr7'),('$itr8'),('$itr9'),('$itr10'),('$itr11'),('$itr12'),('$itr13'),('$itr14'),('$itr15'),('$for1'),('$for2'),('$for3'),('$for4'),('$for5'),('$for6'),('$for7'),('$for8'),('$for9'),('$for10'),('$for11'),('$for12'),('$for13'),('$for14'),('$for15'),('$q1'),('$q2'),('$q3'),('$q4'),('$q5'),('$q6'),('$q7'),('$q8'),('$q9'),('$q10'),('$q11'),('$q12'),('$q13'),('$q14'),('$q15'),('$iu1'),('$iu2'),('$iu3'),('$iu4'),('$iu5'),('$iu6'),('$iu7'),('$iu8'),('$iu9'),('$iu10'),('$iu11'),('$iu12'),('$iu13'),('$iu14'),('$iu15'),('$sc1'),('$sc2'),('$sc3'),('$sc4'),('$sc5'),('$sc6'),('$sc7'),('$sc8'),('$sc9'),('$sc10'),('$sc11'),('$sc12'),('$sc13'),('$sc14'),('$sc15'),('$imp_1'), ('$imp_2'), ('$imp_3'), ('$imp_4'), ('$imp_5'), ('$imp_6'), ('$imp_7'), ('$imp_8'), ('$imp_9'), ('$imp_10'), ('$imp_11'), ('$imp_12'), ('$imp_13'), ('$imp_14'), ('$imp_15'), $totale,('$n_tecnico'),('$pagamento'),STR_TO_DATE('$data', '%d/%m/%Y'),('$allegato'))";

// Lanciamo la query:
$result = mysqli_query($conndb,$sql);

//Prelevo e gestisco gli allegati
$vuoto = '';
$id_commessa_inserita = mysqli_insert_id($conndb);
$sql = "INSERT INTO `allegati_c` (`id_commessa`,`url_file1`,`url_file2`,`url_file3`) VALUES (('$id_commessa_inserita'),('$vuoto'),('$vuoto'),('$vuoto'))";
$result = mysqli_query($conndb,$sql);

//File1
if(isset($_FILES["allegato1"]["name"])){
   $nome_file1 = $_FILES["allegato1"]["name"];
   $nome_allegato1 = "_1_".$id_commessa_inserita."_".$targa."_".$nome_file1; // Serve per identificare un allegato da un altro

   $url_file1 = "allegati_commessa/".$nome_allegato1;


   if (move_uploaded_file($_FILES["allegato1"]["tmp_name"], $url_file1)){
       //echo "File caricato con successo";

       //Inserisce il documento nella tabella "allegati_c"
       //$sql = "INSERT INTO `allegati_c` (`id_commessa`,`url_file1`) VALUES (('$id_commessa_inserita'),('$url_file1'))";
       $sql = "UPDATE allegati_c SET url_file1 =('$url_file1') WHERE id_commessa = '$id_commessa_inserita'";
       $result = mysqli_query($conndb,$sql);
   } else {
       //echo "Errore nel caricamento del file";
   }
}


//File2
if(isset($_FILES["allegato2"]["name"])){
   $nome_file2 = $_FILES["allegato2"]["name"];
   $nome_allegato2 = "_2_".$id_commessa_inserita."_".$targa."_".$nome_file2; // Serve per identificare un allegato da un altro

   $url_file2 = "allegati_commessa/".$nome_allegato2;


   if (move_uploaded_file($_FILES["allegato2"]["tmp_name"], $url_file2)){
       //echo "File caricato con successo";

       //Inserisce il documento nella tabella "allegati_c"
       $sql = "UPDATE allegati_c SET url_file2 =('$url_file2') WHERE id_commessa = '$id_commessa_inserita'";
       $result = mysqli_query($conndb,$sql);
   } else {
       //echo "Errore nel caricamento del file";
   }
}


//File3
if(isset($_FILES["allegato3"]["name"])){
   $nome_file3 = $_FILES["allegato3"]["name"];
   $nome_allegato3 = "_3_".$id_commessa_inserita."_".$targa."_".$nome_file3; // Serve per identificare un allegato da un altro

   $url_file3 = "allegati_commessa/".$nome_allegato3;


   if (move_uploaded_file($_FILES["allegato3"]["tmp_name"], $url_file3)){
       //echo "File caricato con successo";

       //Inserisce il documento nella tabella "allegati_c"
       $sql = "UPDATE allegati_c SET url_file3 =('$url_file3') WHERE id_commessa = '$id_commessa_inserita'";
       $result = mysqli_query($conndb,$sql);
   } else {
       //echo "Errore nel caricamento del file";
   }
}

// RIMANDO ALLA PAGINA DI STAMPA RECUPERANDO L'ID COMMESSA
echo "<script type='text/javascript'>";
echo "location.href='saveandpdf.php?id=" . $id_commessa_inserita . " ';";
echo "</script>";

if (!$result) {
   die("Errore nella query $sql: " . mysqli_error($conndb));
}

else
echo "<center><h3><font color=\"red\">I dati da te inseriti sono stati correttamente registrati</center>\n";
echo "<center><h3><font color=\"red\">Prosegui con il menu' a destra</h3></center>";
echo '</br>';

// E chiudiamo la connessione a MySQL
mysqli_close($conndb);

?>

Ricevo questo errore:
Codice:
Non ho trovato niente con questo id: 0
La query eseguita è: SELECT * , DATE_FORMAT(CommesseOfficina.data,'%d/%m/%Y') as data FROM CommesseOfficina WHERE id = 0
 

elpirata

Utente Attivo
18 Mar 2009
257
7
18
ciao
mi era sfuggita l'ultima parte del tuo post
sei sicuro di avere un record con id=0? generlmente la numerazione parte da 1
Per dar seguito alla migrazione del codice ho effettuato il dump della sola struttura del database, quindi per il momento il database è completamente vuoto. Quando provo ad inserire una nuova commessa, l'inserimento (che in mysql funziona perfettamente) in mysqli fallisce, restituendo il messaggio che ti ho postato prima.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto correggi le query
PHP:
//............
$sql = "INSERT INTO CommesseOfficina (veicolo,targa,km,telaio,cliente,indirizzo,piva,tel,itr1,itr2,itr3,itr4,itr5,itr6,itr7,itr8,itr9,itr10,itr11,itr12,itr13,itr14,itr15,for1,for2,for3,for4,for5,for6,for7,for8,for9,for10,for11,for12,for13,for14,for15,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15,iu1,iu2,iu3,iu4,iu5,iu6,iu7,iu8,iu9,iu10,iu11,iu12,iu13,iu14,iu15,sc1,sc2,sc3,sc4,sc5,sc6,sc7,sc8,sc9,sc10,sc11,sc12,sc13,sc14,sc15,imp_1,imp_2,imp_3,imp_4,imp_5,imp_6,imp_7,imp_8,imp_9,imp_10,imp_11,imp_12,imp_13,imp_14,imp_15,totale,n_tecnico,pagamento,data,allegato)
VALUES
('$veicolo','$targa','$km','$telaio','$cliente','$indirizzo','$piva','$tel','$itr1','$itr2','$itr3','$itr4','$itr5','$itr6','$itr7','$itr8','$itr9','$itr10','$itr11','$itr12','$itr13','$itr14','$itr15','$for1','$for2','$for3','$for4','$for5','$for6','$for7','$for8','$for9','$for10','$for11','$for12','$for13','$for14','$for15','$q1','$q2','$q3','$q4','$q5','$q6','$q7','$q8','$q9','$q10','$q11','$q12','$q13','$q14','$q15','$iu1','$iu2','$iu3','$iu4','$iu5','$iu6','$iu7','$iu8','$iu9','$iu10','$iu11','$iu12','$iu13','$iu14','$iu15','$sc1','$sc2','$sc3','$sc4','$sc5','$sc6','$sc7','$sc8','$sc9','$sc10','$sc11','$sc12','$sc13','$sc14','$sc15','$imp_1', '$imp_2', '$imp_3', '$imp_4', '$imp_5', '$imp_6', '$imp_7', '$imp_8', '$imp_9', '$imp_10', '$imp_11', '$imp_12', '$imp_13', '$imp_14', '$imp_15', $totale,'$n_tecnico','$pagamento','".STR_TO_DATE($data, '%d/%m/%Y')."','$allegato')')";
//............
$sql = "INSERT INTO allegati_c (id_commessa,url_file1,url_file2,url_file3) VALUES ($id_commessa_inserita,'$vuoto','$vuoto','$vuoto'";
//......
togli tutti que batik (simili agli apici) e quelle inutili parentesi
sulla prima verifica di aver scritto bene la parte STR_TO_DATE
poi nella seconda hai messo tre campi url_file1, 2 e 3 a vuoto, se li hai definiti NOT NULL non fa l'insert
 

elpirata

Utente Attivo
18 Mar 2009
257
7
18
ricevo, in fase di inserimento, errore su questa riga, poi subito scompare:
PHP:
${$key} = mysqli_real_escape_string(strtoupper($value));
http://clip2net.com/s/3JHI3JY


le query sono adesso come da te indicate, ma solito errore
Codice:
Non ho trovato niente con questo id: 0
La query eseguita è: SELECT * , DATE_FORMAT(CommesseOfficina.data,'%d/%m/%Y') as data FROM CommesseOfficina WHERE id = 0
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
PHP:
$ultimo_id=mysqli_insert_id($conndb);
subito dopo la query (mysqli_query) da cui ti serve ricavare l'ultimo id inserito

poi per
SELECT * , DATE_FORMAT(CommesseOfficina.data,'%d/%m/%Y') as data FROM CommesseOfficina WHERE id = 0
intanto da quello che capisco tu gia inserisci la data in data nel formato gg/mm/YYYY quindi non ti servo formattarla di nuovo,
poi ribadisco hai un record con id=0? avendo messo WHERE id = 0 la select cerca un record con quell'id e se non lo trova ti da non trovato, se nella tabella CommesseOfficina hai settato il campo id come int(xy) autoincrenment primarykey il primo record che inserisci assume id 1, il secondo 2 ecc... e il record con id 0 non esiste
prova a scrivere semplicemente
SELECT * FROM CommesseOfficina
e guarda se ti estrae qualcosa, comunque verifica anche con phpmyadmin se i record sono stati inseriti