在PHP中使用SELECT只显示一行中的一个值,哪种解决方案最安全、最正确?
我的问题是,当您只想从MySQL DB行中检索一个值时,您认为哪种解决方案最好 例如,假设我们有以下内容: -表在PHP中使用SELECT只显示一行中的一个值,哪种解决方案最安全、最正确?,php,mysql,sql,Php,Mysql,Sql,我的问题是,当您只想从MySQL DB行中检索一个值时,您认为哪种解决方案最好 例如,假设我们有以下内容: -表“用户”,包含三行“用户名”、“密码”和“状态”,以及三个用户“user1”、“user2”和“user3” 如果我只想选择一个用户(比如user1)的状态并将其设置为变量,我将使用: $user_status = mysql_result(mysql_query("SELECT status FROM users WHERE username='user1'"),0); 我在网上搜
“用户”
,包含三行“用户名”、“密码”和“状态”
,以及三个用户“user1”、“user2”和“user3”
如果我只想选择一个用户(比如user1)的状态并将其设置为变量,我将使用:
$user_status = mysql_result(mysql_query("SELECT status FROM users WHERE username='user1'"),0);
我在网上搜索了一下,发现人们使用不同的方法来检索这类信息,比如在选择代码中设置限制1,或者检索整个用户列表,然后对符合他们需求的列表进行排序
我想知道我的解决方案是否是最好和安全的方法(包括来自SQL inject的安全性,请记住php代码中没有使用$\u GET
方法)
可能同时使用
LIMIT 1
和我上面使用的方法(使代码需要更少的资源和时间来执行)?如果需要任何安全性,您应该使用PDO方法,mysql的常规调用已经进行了一段时间
使用mysqli(),但请检查此处
您的查询将是从
用户中选择状态
,其中用户名
='user1'限制1从数据库的角度来看,最安全的方法是在您选择的表中有一个唯一键,并通过该键检索行。在您的示例中,可以有一个userID列,它为每个用户保存一个唯一的ID。如果查询WHERE userID='…'
数据库保证只能有一个结果行
编辑:“公众舆论”建议我添加两件事
你不应该使用mysql!为什么不使用?你不必担心
如果使用正确的数据库设计,则没有理由使用限制1
——完全没有理由。这有点像写代码说,进入汽车;确保你只进了一辆车代码><代码>限制
可用于其他情况,如检索多个结果的前10个结果
第一个-你不再使用mysql\uuz
方法了-它们已经被弃用,而且在本质上是不安全的。
第二,使用PDO接口,如下所示
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
$stmt = $dbh->prepare("SELECT `status` FROM `users` WHERE `username` = ?");
$stmt->execute(array($_GET['username']));
$status = $stmt->fetchColumn();
} catch (PDOException $e) {
echo 'PDO Error : ' . $e->getMessage();
}
使用prepare
-execute
链使用PDO是安全的-它是自动消毒的,所以您不必担心mysql注入。在prepare
部分,您使用参数创建一个查询,在execute
部分,您使用参数等于$执行您准备好的查询,然后获取
并存储结果。您在过程中遇到的任何错误都会被捕获到catch(PDOException$e)
块中,并且可以适当地进行处理。这里sql注入的共同点是什么?如果您不使用用户输入,那么这应该是不可能的。尽管我想知道你想怎么做,因为你必须指定你当前正在测试的用户…或者你可以使用PDO和存储过程…并且不要使用mysql扩展,选择mysqli或PDO。你还应该提到远离不推荐的mysql_*
并采用mysqli
,或者最好是pdo
我相信这是一种登录系统,所以在这里使用ID不是一个选项。我刚刚发布了一个基本的例子,所以我希望得到一个一般的答案,而不是一个具体的答案。也就是说:@SebastianH-我知道如何确保只有一个字段具有上述值,问题是如何更干净、更快速地检索它。另外,我也使用mysql,但我知道mysqli是我想要使用的。感谢您的提醒。如果您关心性能(除了非常重要的情况外,您不应该关心性能),那么从数据库的角度来看,一个键很重要。我想我不必在没有键的列上讲授数据检索->全表扫描@在这种情况下,重要的是要有一个唯一的用户名,这相当于相同的东西。