[PHP]Porting da mysql a mysqli

  • 21 Risposte
  • 18719 Visite

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline condor_uk

  • Membro Giovane
  • **
  • 62
[PHP]Porting da mysql a mysqli
« il: 06 Aprile 2017, 09:31 »
Ragazzi,
mi dareste una mano a sistemare questo codice per effettuare il porting da mysql a mysqli.


Questo il file della connessione che funziona bene:

Codice: [Seleziona]
<?php
$mysqli 
= new mysqli('localhost''utente''pass''miodatabase');
    if (
$mysqli->connect_error) {
        die(
'Errore di connessione (' $mysqli->connect_errno ') '
        
$mysqli->connect_error);
    } else {
        echo 
'Connesso. ' $mysqli->host_info "\n";
    }
?>


questo è l'estratto del codice che invece dovrei trasformare da mysql a mysqli

Codice: [Seleziona]
<?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");
}
}
?>

 :confused:

Offline -Mirco-

  • Global Moderator
  • Esperto
  • *****
  • 1832
  • Sesso: Maschio
  • "Non esiste curva in cui non si può superare"
    • Ilpuntotecnicoeadsl
Re:[PHP]Porting da mysql a mysqli
« Risposta #1 il: 06 Aprile 2017, 09:56 »
 :bye: @condor_uk  ti dò una mano a riguardo .

Allora per prima ti tocca cambiare la sintassi dei metodi procedurali che dovrai chiamare con mysqli e non più mysql.
A sinistra in il metodo in mysql e a destra il corrispettivo da chiamare in mysqli .

Codice: [Seleziona]
$connection2 = mysql_connect( 'host', 'username', 'password', true) -> $connection2 = mysqli_connect( 'host', 'username', 'password');
mysql_affected_rows -> mysqli_affected_rows($link)
mysql_close -> mysqli_close($link)
mysql_data_seek -> mysqli_data_seek( $result, $offset)
mysql_errno -> mysqli_errno( $link)
mysql_error -> mysqli_error( $link)
mysql_fetch_array -> mysqli_fetch_array( $result, $type)
mysql_fetch_assoc -> mysqli_fetch_assoc( $result)
mysql_fetch_lengths -> mysqli_fetch_lengths( $result )
mysql_fetch_object -> mysqli_fetch_object( $result, $class, $params)
mysql_fetch_row -> mysqli_fetch_row( $result)
mysql_field_seek -> mysqli_field_seek( $result, $number)
mysql_free_result -> mysqli_free_result(result)
mysql_get_client_info -> mysqli_get_client_info( $link)
mysql_get_host_info -> mysqli_get_host_info( $link)
mysql_get_proto_info -> mysqli_get_proto_info( $link)
mysql_get_server_info -> mysqli_get_server_info( $link)
mysql_info -> mysqli_info( $link)
mysql_insert_id -> mysqli_insert_id( $link)
mysql_num_rows ->  mysqli_num_rows( $result)
mysql_ping -> mysqli_ping( $link)
mysql_query -> mysqli_query( $link, $query)
mysql_real_escape_string -> mysqli_real_escape_string( $link)
mysql_select_db - > mysqli_select_db( $link, $database)
mysql_set_charset -> mysqli_set_charset( $link, $charset)
mysql_stat -> mysqli_stat( $link)
mysql_thread_id -> mysqli_thread_id( $link)



Ti raccomando di passare correttamente tutti i parametri quando vai a chiamare i nuovi metodi.

Per il resto il mio consiglio classico da developer è sempre quello di andare di print_r o var_dump per debuggare line dopo line nel caso il risultato non è quello atteso.

 :hello:
"Non esiste curva in cui non si può superare"
Ayrton Senna

Offline condor_uk

  • Membro Giovane
  • **
  • 62
Re:[PHP]Porting da mysql a mysqli
« Risposta #2 il: 06 Aprile 2017, 10:44 »
Ciao Mirco,
anzitutto grazie per la risposta, giusto per darmi una base di partenza che abbia a supporto un esempio pratico,
come posso effettuare il porting da mysql a mysqli di questa parte di codice ?

Codice: [Seleziona]
// 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);


Grazie  :bye:

Offline -Mirco-

  • Global Moderator
  • Esperto
  • *****
  • 1832
  • Sesso: Maschio
  • "Non esiste curva in cui non si può superare"
    • Ilpuntotecnicoeadsl
Re:[PHP]Porting da mysql a mysqli
« Risposta #3 il: 06 Aprile 2017, 11:08 »
@condor_uk  eccolo, ti ho aggiunto anche la riga in cui devi inserire la connessione al DB, la trovi commentata.

Codice: [Seleziona]
// effettuo l'escape dei caratteri speciali per inserirli all'interno della query
$username      = mysqli_real_escape_string($username);
$password = mysqli_real_escape_string($password);

// preparo ed invio la query

//Qui devi inserire la connessione al DB
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT * FROM utenti WHERE username = '$username' AND password = MD5('$password')";
$result = mysqli_query(link,$query);

// controllo l'esito
if (!$result) {
die("Errore nella query $query: " . mysql_error());
}

$record = mysqli_fetch_array($result,MYSQLI_ASSOC);

Nell'ultima riga ti ricordo che se il risultato è un'array associativo ma scelto come indicato da me MYSQLI_ASSOC mentre se è un'array numerico ti tocca MYSQLI_NUM

Il codice è untested, quindi logicamente prova e poi al limite debugga  :good:
"Non esiste curva in cui non si può superare"
Ayrton Senna

Offline condor_uk

  • Membro Giovane
  • **
  • 62
Re:[PHP]Porting da mysql a mysqli
« Risposta #4 il: 06 Aprile 2017, 16:07 »
Ciao Mirco,
grazie per il supporto, sto eseguendo un pò di test e non appena ne vengo a capo ti aggiorno.

Per il momento ho instaurato la connessione ma continuo ad avere problemi con la query che, a quanto pare,
non riceve i parametri username e password

Codice: [Seleziona]
Errore nella query SELECT * FROM utenti WHERE username = '' AND password = MD5(''):
Ti aggiorno appena ho novità.

Grazieee  :hello:

Offline -Mirco-

  • Global Moderator
  • Esperto
  • *****
  • 1832
  • Sesso: Maschio
  • "Non esiste curva in cui non si può superare"
    • Ilpuntotecnicoeadsl
Re:[PHP]Porting da mysql a mysqli
« Risposta #5 il: 06 Aprile 2017, 20:07 »
 :bye: @condor_uk  se col metodo procedurale di mysql funzionava la connessione al DB per forza di cose deve andare anche con mysqli.

Se invece NON andava neanche in precedenza ti tocca verificare se quell'utenza che hai creato è legata correttamente al DB e se hai dato effettivamente i permessi per eseguire l'operazione (in questo caso comando SELECT).

"Non esiste curva in cui non si può superare"
Ayrton Senna

Offline proniuzelo

  • Membro Giovane
  • **
  • 87
Re:[PHP]Porting da mysql a mysqli
« Risposta #6 il: 06 Aprile 2017, 22:28 »
----------
« Ultima modifica: 22 Febbraio 2018, 15:16 da tro69 »

Offline condor_uk

  • Membro Giovane
  • **
  • 62
Re:[PHP]Porting da mysql a mysqli
« Risposta #7 il: 07 Aprile 2017, 09:39 »
Buongiorno a tutti,
purtroppo nonostante i vostri, per me importanti suggerimenti, ancora non riesco a far funzionare il codice,

per completezza riporto il codice, ivi compreso la connessione al database;

Connessione al db

Codice: [Seleziona]
<?php
// Apriamo la connessione verso il database mysql
$conndb mysqli_connect('localhost''utente''password''database');

// Controlliamo l'esito della connessione
if (!$conndb) {
echo 'Errore durante la connessione al server MySQL';
exit();
}

// Chiudiamo la connessione
mysqli_close($conndb);

?>



File index.php
Codice: [Seleziona]
<?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");
}
}
?>

 :rotfl:

Offline -Mirco-

  • Global Moderator
  • Esperto
  • *****
  • 1832
  • Sesso: Maschio
  • "Non esiste curva in cui non si può superare"
    • Ilpuntotecnicoeadsl
Re:[PHP]Porting da mysql a mysqli
« Risposta #8 il: 07 Aprile 2017, 11:14 »
Hai provato ad inserire qualche print_r o var_dump per capire dove si blocca?

Dove ti segnala l'errore hai provato a farti stampare i valori delle variabili che utilizzi come parametri nelle funzioni?
"Non esiste curva in cui non si può superare"
Ayrton Senna

Offline condor_uk

  • Membro Giovane
  • **
  • 62
Re:[PHP]Porting da mysql a mysqli
« Risposta #9 il: 07 Aprile 2017, 11:36 »
@mirco

se stampo il valore di

Codice: [Seleziona]

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

ottengo

Codice: [Seleziona]
object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(3) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) }
 :martello:

Offline -Mirco-

  • Global Moderator
  • Esperto
  • *****
  • 1832
  • Sesso: Maschio
  • "Non esiste curva in cui non si può superare"
    • Ilpuntotecnicoeadsl
Re:[PHP]Porting da mysql a mysqli
« Risposta #10 il: 07 Aprile 2017, 13:48 »
Comincia a stamparti la query, lanciarla a DB e vedere se ti restituisce occorrenze.

Ora potremmo andare direttamente al punto del problema, ma costruirsi una buona logica di Debug è fondamentale, quindi questa è la via da seguire.

Anche perchè oggi si tratta di una semplice "SELECT" che non va, però man mano che ti andrai ad infilarti in situazioni più complesse capirai bene quanto è importante effettuare un buon debug per venire a capo dei problemi che usciranno  :D:
"Non esiste curva in cui non si può superare"
Ayrton Senna

Offline condor_uk

  • Membro Giovane
  • **
  • 62
Re:[PHP]Porting da mysql a mysqli
« Risposta #11 il: 07 Aprile 2017, 14:43 »
@mirco,
se lancio la query tramite phpmyadmin il risultato è corretto
ed estrae 1 occorrenza

Codice: [Seleziona]
SELECT * FROM utenti WHERE username = 'admin' AND password = MD5('admin')

Offline -Mirco-

  • Global Moderator
  • Esperto
  • *****
  • 1832
  • Sesso: Maschio
  • "Non esiste curva in cui non si può superare"
    • Ilpuntotecnicoeadsl
Re:[PHP]Porting da mysql a mysqli
« Risposta #12 il: 07 Aprile 2017, 21:45 »
Perdonami @condor_uk  ma allora è funzionante.

Di fatto guardando il var_dump che hai messo poco sopra, ovvero:
Codice: [Seleziona]
object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(3) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) }

nell'array hai num_rows = 1, ovvero sia la query ti ha restituito correttamente l'occorrenza che ti fornisce anche il DB ...  :good:
"Non esiste curva in cui non si può superare"
Ayrton Senna

Offline condor_uk

  • Membro Giovane
  • **
  • 62
Re:[PHP]Porting da mysql a mysqli
« Risposta #13 il: 08 Aprile 2017, 09:09 »
buongiorno,
nonostante "dovrebbe" funzionare, io continuo imperterrito a ricevere errore

Codice: [Seleziona]
Query: SELECT * FROM utenti WHERE username = '' AND password = MD5('')
Errore:

Secondo me, ma chiedo lumi, l'errore potrebbe risiedere in questa parte del codice:

Codice: [Seleziona]
// 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);

 :confused:

Offline Miguel89

  • Ex-Staff
  • VIP
  • *****
  • 5047
  • Sesso: Maschio
Re:[PHP]Porting da mysql a mysqli
« Risposta #14 il: 08 Aprile 2017, 11:31 »
Non ho analizzato per bene tutto il codice, ma ho notato che in questa riga:
Codice: [Seleziona]
die("Query:  " .$query. " <br>Errore: " . mysql_error($conndb));usi mysql_error, mentre devi usare mysqli_error

Comunque, il problema è che i campi username e password sono vuoti...
Fai un echo delle 2 variabili in vari punti per individuare dov'è il problema