我想做这样的事情:
$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'];
但是还有比这更有效的方法吗?非常感谢,问候<</p>
你一针见血:你想做的是SELECT userid FROM users WHERE username='$username'
.试试吧 - 它会:)工作
SELECT *
几乎总是一个坏主意;最好指定您希望MySQL返回的列的名称。当然,您需要使用mysql_fetch_assoc
或类似的东西才能将数据实际放入PHP变量中,但至少这样可以节省MySQL发送所有这些您无论如何都不会使用的列的开销。
顺便说一句,您可能希望使用较新的mysqli库或PDO。这些也比旧的mysql库更有效,旧的mysql库正在被弃用。
你不仅可以,而且应该。不幸的是,太多的年轻开发人员养成了选择太多数据的习惯。运行查询后,无需执行 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 是第一个。
"通常"的方法是只选择您需要的列。
任何属于选择且不需要的列都会减慢检索速度。部分原因是网络流量,部分原因是如果仅选择某些列,数据库引擎可以应用某些优化。
select *
通常在生产代码中不受欢迎。
您的查询是正确的:
$query = mysql_query("SELECT userid FROM users WHERE username='$username'");
如果正确完成,这将起作用。请注意,必须使用 mysql_real_escape_string
正确转义$username
。我建议查看参数化查询,以降低引入 SQL 注入无漏洞的风险。
您可以更改的另一件事是使用 mysql_result
而不是循环:
$the_user_id = mysql_result($result, 0);
这假设知道您只会得到一行。
是的,这是一个很好的优化实践!
另外,如果您想更进一步并使其超级优化,请尝试添加 LIMIT,如下所示:$query=mysql_query("SELECT userid FROM users WHERE username='$username' LIMIT 1");
当然,这假定您只返回一个用户 ID,并且一旦找到它,就会使数据库引擎停止。
但是,最重要的是:始终转义/清理您的输入数据!(不能很好地强调这一点)
您可以使用一行代码来执行此操作
echo array_values(mysqli_fetch_array($mysqli->query("SELECT name FROM user WHERE id='$userid'")))[0];
在使用它之前,您必须按如下所示连接到数据库
$mysqli = new mysqli('HOST', 'USERNAME', 'PASSWORD', 'DATABASE');
致谢@samuel·托马斯