IlPuntoTecnico

Hardware e Software => Programmazione => Topic aperto da: condor_uk - 06 Aprile 2017, 09:31

Titolo: [PHP]Porting da mysql a mysqli
Inserito da: condor_uk - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: -Mirco- - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: condor_uk - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: -Mirco- - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: condor_uk - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: -Mirco- - 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).

Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: proniuzelo - 06 Aprile 2017, 22:28
----------
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: condor_uk - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: -Mirco- - 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?
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: condor_uk - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: -Mirco- - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: condor_uk - 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')
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: -Mirco- - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: condor_uk - 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:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: Miguel89 - 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
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: condor_uk - 08 Aprile 2017, 12:09
ciao @Miguel89, avevo già sistemato quella parte di codice ma non avevo aggiornato il post  :confused:

ma sono sempre al solito errore
Codice: [Seleziona]
Query: SELECT * FROM utenti WHERE username = '' AND password = MD5('')
Errore:

 :smash:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: Miguel89 - 08 Aprile 2017, 12:15
Hai provato a farti stampare il valore delle variabili userame e password in vari punti del codice??
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: -Mirco- - 08 Aprile 2017, 17:28
Esatto, debugga in stile break point.
Quindi piazzati dei print_r duranti le righe e vedi se le variabili sono sempre valorizzate o per qualche motivo si perdono prima che le passi alla funzione. :bye:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: condor_uk - 11 Aprile 2017, 15:02
Allora rieccomi,
seguendo i consigli di @mirco ho debuggato in stile breck point e a quanto pare perdo la variabile nel momento in cui
arrivo al mysqli_real_escape_string

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

 :confused:
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: -Mirco- - 11 Aprile 2017, 23:05
@condor_uk  la variabile $conndb è valorizzata al momento che chiami string mysqli_real_escape_string?
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: Miguel89 - 11 Aprile 2017, 23:08
Ciao condor_uk,
ci puoi ri-postare tutto il codice, anche la parte in cui fai la connessione al database?

Nel codice che avevi postato prima:
[...]
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);

?>

[...]

alla fine c'è un
Codice: [Seleziona]
mysqli_close($conndb);che non devi fare in quel punto, sennò poi è normale che non funziona nulla...

la connessione la devi chiudere alla fine, quindi dopo aver eseguito la query e recuperato il risultato
Titolo: Re:[PHP]Porting da mysql a mysqli
Inserito da: -Mirco- - 13 Aprile 2017, 22:56
@condor_uk  mi accodo alla richiesta di @Miguel89

Senza il codice completo non possiamo seguire al 100% il flusso.
Se riesci ad inserirlo completo possiamo approfondire!