-1

我刚刚开始编写函数,而不是内联编写所有内容。这就是通常编写可重用函数的方式吗?

function test_user($user) {
$conn = get_db_conn();
$res = mysql_query("SELECT * FROM users WHERE uid = $user");
$row = mysql_fetch_assoc($res);
if (count($row) == 1) {
return true;
}
else {
    return false;
}
}

当有人登录时,我有他们的 UID。我想看看它是否已经在数据库中。它的基本逻辑将用于

“如果存在,则显示首选项,如果!存在,则显示注册框”之类的流程。显然它取决于它在其余代码中的使用方式,但这会像宣传的那样工作吗?我是否陷入了任何陷阱?谢谢!

4

5 回答 5

1

试试这个:

$conn = get_db_conn(); # should reuse a connection if it exists

# Have MySQL count the rows, instead of fetching a list (also prevent injection)
$res = mysql_query(sprintf("SELECT COUNT(*) FROM users WHERE uid=%d", $user));

# if the query fails
if (!$res) return false;

# explode the result
list($count) = mysql_fetch_row($res);
return ($count === '1');

想法:

  • 您需要更好地处理失败的查询,因为 return false 意味着用户不存在。

  • 使用数据库计数,会更快。

  • 我假设uid是 sprintf 语句中的整数。这对于用户输入现在是安全的。

  • 如果您有一个看起来像的 if 语句,if (something) { true } else { false }您应该将其折叠为 just return something

高温高压

于 2009-07-16T23:27:24.127 回答
0

那是可重复使用的,是的。您可能需要考虑将 SQL 移出 PHP 代码本身。

尽管您不一定要求优化,但您可能需要考虑查询用户的显示首选项(我假设它存储在数据库中),如果返回为空,则显示注册框。您将节省访问数据库的时间,并且根据您的流量,这可能是巨大的。如果您决定保留此实现,我建议您在 SELECT 中仅从数据库中选择一列。只要您不关心数据,就没有理由获取每一列。

于 2009-07-16T23:25:55.707 回答
0

首先,你需要打电话

$user = mysql_real_escape_string($user);

因为您的代码中存在 sql 注入错误,请参阅手册。其次,您可以通过将查询更改为:

SELECT COUNT(1) FROM user WHERE uid = $user;

它只允许您评估来自$row. 最后一件事,一旦您掌握了 php 的基础知识,请考虑查看 php 框架。它们会给你带来麻烦,不会让你写出好的代码,但它们可能会为你节省很多工作。

于 2009-07-16T23:28:05.997 回答
0

缩进!总的来说,它看起来不错......检查评论..

function test_user($user)
{
   $conn = get_db_conn(); //this should be done only once. Maybe somewhere else...?
   $res = mysql_query("SELECT uid FROM users WHERE uid = $user");
   $row = mysql_fetch_assoc($res);
     //I can't remember...can you return count($row) and have that forced to boolean ala C? It would reduce lines of code and make it easier to read.
   if (count($row) == 1) {
      return true;
   }
   else {
      return false;
   }
}
于 2009-07-16T23:30:40.923 回答
0

还,

if (condition) {
    return true;
}
else {
    return false;
}

可以改写为:

return condition;

这节省了相当多的打字和阅读时间:)

于 2009-07-16T23:31:01.483 回答