Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用SELECT只显示一行中的一个值,哪种解决方案最安全、最正确?_Php_Mysql_Sql - Fatal编程技术网

在PHP中使用SELECT只显示一行中的一个值,哪种解决方案最安全、最正确?

在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); 我在网上搜

我的问题是,当您只想从MySQL DB行中检索一个值时,您认为哪种解决方案最好

例如,假设我们有以下内容:

-表
“用户”
,包含三行
“用户名”、“密码”和“状态”
,以及三个用户“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是我想要使用的。感谢您的提醒。如果您关心性能(除了非常重要的情况外,您不应该关心性能),那么从数据库的角度来看,一个键很重要。我想我不必在没有键的列上讲授数据检索->全表扫描@在这种情况下,重要的是要有一个唯一的用户名,这相当于相同的东西。