PHP Migrazione da mysql_ * a mysqli_

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:

  • specificare la query
  • prendi il risultato
  • get 0. row ("1 °" in inglese)
  • ottieni la colonna 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; 
  • specificare la query
  • prendi il risultato
  • get 0. row
  • se questo è uguale a 1: return 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.