PHP从mysql_ *迁移到mysqli_ [英] PHP Migrating from mysql_* to mysqli_

查看:37
本文介绍了PHP从mysql_ *迁移到mysqli_的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚接手了一个老项目,我要做的第一件事是从mysql_*扩展名迁移到mysqli_*.我之前还没有使用过PHP.大多数新代码都可以使用,但是在下面的示例中,我似乎把事情搞砸了……

I just took up a old project and the first thing I needed to do was to migrate from the mysql_* extension to the mysqli_* one. I haven't worked with PHP much before... Mosts of the new code works but in the examples below I seems to mess things up...

旧功能:

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');
}

新的(无效)功能:

function user_id_from_username($username) {
    $username = sanitize($username);
    $id = mysqli_query(connect(),"SELECT `user_id` FROM `users` WHERE `username` = '$username'");
    return $id;
}

另一个旧的:

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;
}

和新的:

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;
}

我的消毒功能:

function sanitize($data) {
    return htmlentities(strip_tags(mysqli_real_escape_string(connect(), $data)));
}

推荐答案

好的,因此在第一个函数中,您尝试替换

Ok, so in the first function you are trying to replace

return mysql_result(mysql_query("SELECT `user_id` FROM `users` WHERE `username` = '$username'"), 0, 'user_id');

让我们首先弄清楚它的作用:

Let's first make clear what this does:

  • 指定查询
  • 获取结果
  • 获取0行(英语中为"1st")
  • 获取列user_id
  • specify query
  • fetch the result
  • get 0. row ("1st" in English)
  • get column user_id

现在逐步使用mysqli_进行此操作:

Now do this step-by-step with 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'];

您无需指定该行,因为fetch_assoc仅返回一行.

You don't need to specify the row as fetch_assoc returns only one.

现在是第二个功能

return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"), 0) ==1) ? $user_id : FALSE;

  • 指定查询
  • 获取结果
  • 获取0行.
  • 如果等于1:返回user_id,否则返回FALSE
    • specify query
    • fetch result
    • get 0. row
    • if this equals 1: return user_id, otherwise FALSE
    • 现在使用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;
      

      但是等等-为什么我使用 mysqli_fetch_row 在此使用 mysqli_fetch_assoc 吗? RTM;)

      But wait - why did I use mysqli_fetch_row here whereas mysqli_fetch_assoc was used above? RTM ;)

      我们今天学到了什么?仅因为您可以编写尽可能短的代码并不意味着您应该这样做.如果对原始代码进行了更多拆分,则向MySQLi的过渡应该非常容易,因为您可以轻松调试较小的部分,而不是复杂的表达式.

      What have we learned today? Only because you can write your code as short as possible doesn't mean you should. If the original code had been split up a bit more, the transition to MySQLi should have been quite easy, as you could have easily debugged smaller parts instead of a complex expression.

      这篇关于PHP从mysql_ *迁移到mysqli_的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆