Ho appena preso un vecchio progetto e la prima cosa che wherevo fare era migrare dall'estensione mysql_*
a quella mysqli_*
. Non ho lavorato con PHP molto prima … Mosts del nuovo codice funziona ma negli esempi qui sotto mi sembra di rovinare tutto …
Vecchia function:
function user_id_from_username($username) { $username = sanitize($username); return mysql_result(mysql_query("SELECT `user_id` FROM `users` WHERE `username` = '$username'"), 0, 'user_id'); }
Nuova function (nessuna funzionante):
function user_id_from_username($username) { $username = sanitize($username); $id = mysqli_query(connect(),"SELECT `user_id` FROM `users` WHERE `username` = '$username'"); return $id; }
Un altro vecchio:
function login($username, $password) { $user_id = user_id_from_username($username); $username = sanitize($username); $password = md5($password); return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"), 0) ==1) ? $user_id : FALSE; }
E quello nuovo:
function login($username, $password) { $user_id = user_id_from_username($username); $username = sanitize($username); $password = md5($password); $check = mysqli_query(connect(),"SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"); return $check == $user_id ? TRUE : FALSE; }
La mia function di sterilizzazione:
function sanitize($data) { return htmlentities(strip_tags(mysqli_real_escape_string(connect(), $data))); }
Ok, quindi nella prima function che stai cercando di sostituire
return mysql_result(mysql_query("SELECT `user_id` FROM `users` WHERE `username` = '$username'"), 0, 'user_id');
Prima chiariamo cosa fa:
user_id
Ora fai questo passo dopo passo con mysqli_
:
//specify query $result = mysqli_query(connect(),"SELECT `user_id` FROM `users` WHERE `username` = '$username'"); //fetch result $row = mysqli_fetch_assoc($result); //get column return $row['user_id'];
Non è necessario specificare la row come fetch_assoc
restituisce solo uno.
Ora per la seconda function
return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"), 0) ==1) ? $user_id : FALSE;
user_id
, altrimenti FALSE
Ora con mysqli_
:
//specify query $result = mysqli_query(connect(),"SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"); //fetch result $row = mysqli_fetch_row($result); //if first returned column is equal to 1 return $user_id //otherwise FALSE return ($row[0]==1) ? $user_id : FALSE;
Ma aspetta – perché ho usato mysqli_fetch_row
qui mentre mysqli_fetch_assoc
stato usato sopra? RTM;)
Cosa abbiamo imparato oggi? Solo perché puoi scrivere il tuo codice il più breve ansible non significa che dovresti. Se il codice originale fosse stato diviso un po 'di più, la transizione a MySQLi avrebbe dovuto essere abbastanza semplice, dato che avresti potuto facilmente eseguire il debug di parti più piccole invece di un'espressione complessa.