无法在MySQL表中搜索查询

时间:2017-04-28 19:42:15

标签: php mysql

我想基于密钥在名为“keys”的MySQL表中搜索查询,然后返回该查询的其他值。 (例如“id”)

这就是我的表格:

id              key                          customer
88633631        gNjp4CW6E/VfdBqli6zBLw==     Name1
41317488        bi74frT3LFGTRkvoW7B31Q==     Name2

..这就是我的PHP代码的样子:

<?php
    require 'config.inc.php';
    /* Declare variables */
    $key = $_GET["key"];   
    $id = "";
    $customer = "";
    /* Connect to database and grab the keys */
    @mysql_connect($g_mysql_host,$g_mysql_usr,$g_mysql_pass)
    or die("Couldn't connect to database server");
    @mysql_selectdb($g_mysql_db)
    or die("Couldn't select database");
    $query = "SELECT * FROM `keys` WHERE `key` = $key";
    $result = mysql_query($query);
    if (!$result) exit("INVALID KEY");
    else {
        while ($row = mysql_fetch_array($result)) {
            echo $row['id'];
        }
    }
?>

但这不起作用。我认为这个问题是由密钥末尾的2个等于引起的,但我不确定。 如果我想搜索“id”然后打印搜索到的“id”的“密钥”,它就会起作用。

我不想在结尾删除2个等号,因为它们与AES128填充有关。

实际上,问题不是由密钥末尾的2个等于引起的。它是由字符串中的“+”字符引起的,但如果我将其删除,则无法解密AES128加密文本。

3 个答案:

答案 0 :(得分:1)

你这样做有几个问题。

首先,您没有引用您的价值:'$key'

$query = "SELECT * FROM `keys` WHERE `key` = '$key'";

其次,您的代码对SQL注入是开放的。逃避你的价值:

$key = mysql_real_escape_string($_GET["key"]);

以上代码是您需要做的绝对最低限度 接下来的事情是mysql_函数已被弃用了很长时间,并已在PHP 7中删除。

您需要切换到mysqli_PDO。你越早切换越好。 请阅读此问题以获取更多信息:How can I prevent SQL injection in PHP?

除了上面提到的所有问题之外,如果你没有使用keywords and reserved words作为表或列名,那么你将自己保存(如果他们必须阅读你的代码,那就更有其他人了)正如杰伊布兰查德所指出的那样。

答案 1 :(得分:0)

这种情况正在发生,因为你没有转义应该是

的输入
"SELECT * FROM `keys` WHERE `key` = '$key'"

但无论如何这不是最好的方法,你必须使用预备语句和包装器,如PDO

像这样的东西

$stmt = $db->prepare('SELECT * FROM `keys` WHERE `key` = :key');
$stmt->bindValue(":key", $_GET["key"]);

if ($stmt->execute()) {
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo $row['id'];
    }
}

答案 2 :(得分:0)

如果更改以下行

怎么办?
$query = "SELECT * FROM `keys` WHERE `key` = $key";

$query = "SELECT * FROM `keys` WHERE `key` = '".$key."' ";