IlPuntoTecnico
Hardware e Software => Programmazione => Topic aperto 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:
<?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
<?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:
-
: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 .
$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:
-
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 ?
// 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:
-
@condor_uk eccolo, ti ho aggiunto anche la riga in cui devi inserire la connessione al DB, la trovi commentata.
// 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:
-
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
Errore nella query SELECT * FROM utenti WHERE username = '' AND password = MD5(''):
Ti aggiorno appena ho novità.
Grazieee :hello:
-
: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).
-
----------
-
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
<?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
<?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:
-
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?
-
@mirco
se stampo il valore di
// 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
object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(3) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) }
:martello:
-
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:
-
@mirco,
se lancio la query tramite phpmyadmin il risultato è corretto
ed estrae 1 occorrenza
SELECT * FROM utenti WHERE username = 'admin' AND password = MD5('admin')
-
Perdonami @condor_uk ma allora è funzionante.
Di fatto guardando il var_dump che hai messo poco sopra, ovvero:
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:
-
buongiorno,
nonostante "dovrebbe" funzionare, io continuo imperterrito a ricevere errore
Query: SELECT * FROM utenti WHERE username = '' AND password = MD5('')
Errore:
Secondo me, ma chiedo lumi, l'errore potrebbe risiedere in questa parte del codice:
// 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:
-
Non ho analizzato per bene tutto il codice, ma ho notato che in questa riga:
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
-
ciao @Miguel89, avevo già sistemato quella parte di codice ma non avevo aggiornato il post :confused:
ma sono sempre al solito errore
Query: SELECT * FROM utenti WHERE username = '' AND password = MD5('')
Errore:
:smash:
-
Hai provato a farti stampare il valore delle variabili userame e password in vari punti del codice??
-
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:
-
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
// 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:
-
@condor_uk la variabile $conndb è valorizzata al momento che chiami string mysqli_real_escape_string?
-
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
<?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
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
-
@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!