PHP从mysql *迁移到mysqli [重复]

Posted

技术标签:

【中文标题】PHP从mysql *迁移到mysqli [重复]【英文标题】:PHP Migrating from mysql_* to mysqli_ [duplicate] 【发布时间】:2013-12-24 20:51:27 【问题描述】:

我刚刚接手了一个旧项目,我需要做的第一件事就是从 mysql_* 扩展迁移到 mysqli_* 扩展。我以前很少使用 php……大部分新代码都可以工作,但在下面的示例中,我似乎把事情搞砸了……

旧功能:

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

【问题讨论】:

您收到了哪些错误消息? mysql_resultmysqli、but you can write one 中没有等价物 @thatonefreeman 我没有得到任何... @Wrikken 他没有在他的新代码中使用 mysql_result。还是我错过了你的意思? @thatonefreeman:他不是,但在他的新代码中,他假设mysqli_query() 与之前的mysql_result(mysql_query()) 组合一样工作,因此我提到了它。 (即:当前代码将结果集资源与值进行比较,而不是获取的结果)。 【参考方案1】:

好的,所以在您尝试替换的第一个函数中

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

让我们先弄清楚这是做什么的:

指定查询 获取结果 get 0. row(英文中的“1st”) 获取列user_id

现在使用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 只返回一个。


现在是第二个功能

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

现在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 ;)


我们今天学到了什么?仅仅因为您可以编写尽可能短的代码并不意味着您应该这样做。如果将原始代码拆分得更多一些,那么过渡到 MySQLi 应该会很容易,因为您可以轻松地调试较小的部分而不是复杂的表达式。

【讨论】:

以上是关于PHP从mysql *迁移到mysqli [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP mysql 到 mysqli 迁移问题(自定义函数,程序风格)

从 mysql 连接迁移到 mysqli

pdo 相对于 mysql_* 或 mysqli_* 的优势 [重复]

将大型网站从 MySQL 切换到 MySQLi [重复]

从 MYSQL 更新到 MYSQLI [重复]

从mysql转换为mysqli(mysql_fetch_array)[重复]