10

我想做这样的事情:

$query=mysql_query("SELECT userid FROM users WHERE username='$username'");
$the_user_id= .....

因为我想要的只是与用户名对应的用户 ID。

通常的方法是:

$query=mysql_query("SELECT * FROM users WHERE username='$username'");
while ($row = mysql_fetch_assoc($query))
    $the_user_id= $row['userid'];

但是有什么比这更有效的吗?非常感谢,问候

4

6 回答 6

13

你一针见血:你想做的是SELECT userid FROM users WHERE username='$username'。试试看 - 它会工作:)

SELECT *几乎总是一个坏主意;最好指定您希望 MySQL 返回的列的名称。当然,您仍然需要使用mysql_fetch_assoc或类似的东西才能将数据实际放入 PHP 变量中,但至少这可以节省 MySQL 发送所有这些您将不会使用的列的开销。

顺便说一句,您可能想改用更新的 mysqli 库或 PDO。这些也比不推荐使用的旧 mysql 库更有效。

于 2012-05-01T20:55:09.607 回答
4

不仅可以,而且应该。不幸的是,太多的年轻开发人员养成了选择太多数据的习惯。运行查询后,您无需执行 while 循环,因为您只有一条记录返回。相反,只需使用以下内容:

$sql = sprintf( "SELECT userid FROM users WHERE username = '%s'", $username );
$result = mysql_query( $sql ) or die( mysql_error() );
$data = mysql_result( $result, 0 );

if ( $data ) echo $data; // first userid returned

的第二个参数mysql_result()是您要检索的行索引。0 是第一个。

于 2012-05-01T20:56:13.723 回答
3

“通常”的方法是选择您需要的列。

任何属于 select 且不需要的列都会减慢检索速度。部分原因是网络流量,部分原因是如果仅选择某些列,数据库引擎可以应用某些优化。

并且select *通常在生产代码中不受欢迎。

于 2012-05-01T20:55:27.690 回答
3

您的查询是正确的:

$query = mysql_query("SELECT userid FROM users WHERE username='$username'");

如果操作正确,这将起作用。请注意,$username必须使用 正确转义mysql_real_escape_string。我建议查看参数化查询以降低引入 SQL 注入无懈可击的风险。

您可以更改的另一件事是使用mysql_result而不是循环:

$the_user_id = mysql_result($result, 0);

这假设知道你只会得到一排。

于 2012-05-01T20:55:42.403 回答
1

是的,这是一个很好的优化实践!

此外,如果您想更进一步并使其超级优化,请尝试添加一个 LIMIT,如下所示:$query=mysql_query("SELECT userid FROM users WHERE username='$username' LIMIT 1");

当然,这假设您希望只返回一个用户 ID,并且一旦找到它就会使数据库引擎停止。

但是,最重要的是:始终转义/清理您的输入数据!(不能很好地强调这一点)

于 2012-05-01T21:12:02.150 回答
0

你可以用一行代码做到这一点

echo array_values(mysqli_fetch_array($mysqli->query("SELECT name FROM user WHERE id='$userid'")))[0];

在使用此之前,您必须如下所示连接到数据库

 $mysqli = new mysqli('HOST', 'USERNAME', 'PASSWORD', 'DATABASE');

感谢@samuel t thomas

于 2016-05-23T09:16:23.807 回答