我想根据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
。''',以及我能想到的所有其他排列。
答案 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