PDO / MySQL - 无法使用列参数

时间:2016-12-10 21:21:26

标签: php mysql pdo

我想根据1)searchtype和2)查询的用户输入搜索我的表。 searchtype将是所选列(因此按名称,评级,位置等进行搜索。)

我的代码是:

$pdo = new PDO('mysql:host=localhost;dbname=assignment','admin', 'puppies');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $result = $pdo->prepare('SELECT * FROM `profs` WHERE :searchtype LIKE :query');
    $result->bindValue(':searchtype', $_GET['searchtype']);
    $result->bindValue(':query', "%" . $_GET['query'] . "%");
    $result->execute();
    $result->debugDumpParams();
    } catch (PDOException $e) {
        echo $e->getMessage();
    }

    echo "<table>";
    foreach ($result as $record) {
        echo "<tr><td>", $record['name'], '</td>';
        echo "<td>", $record['school'], "</td>";
        echo "<td>", $record['subject'], "</td>";
        echo "<td>", $record['latitude'], ",", $record['longitude'], "</td></tr>";
    }
    echo '</table>';

我确信问题出在searchtype上。如果我在prepare语句中直接替换:searchtype with name,我的代码按计划运行。在bindValue语句中,我甚至直接将$ _GET ['searchtype']替换为name,'“'。name。''',以及我能想到的所有其他排列。

2 个答案:

答案 0 :(得分:1)

好的,我们首先指出不允许绑定列名。 (表也是,顺便说一句)。

更进一步,我认为你不需要switch。您可以定义一些字段的白名单(是的,即使您通过select有字段,它仍然容易受到攻击,因为我可以将您的<select>更改为我的<input>同名字段。

所以,使用whiltelist,一些基本代码是:

$allowed_fields = ['field1', 'field2', 'field3'];  // whitelist here
if (in_array($_GET['searchtype'], $allowed_fields)) {
    $result = $pdo->prepare('SELECT * FROM `profs` WHERE ' . $_GET['searchtype'] . ' LIKE :query');
    $result->bindValue(':query', "%" . $_GET['query'] . "%");
    $result->execute();
    $result->debugDumpParams();
} catch (PDOException $e) {
    echo $e->getMessage();
}

答案 1 :(得分:0)

您无法绑定列名称 $ _GET列名称是个坏主意,请使用switch