我试图让数据库查询页面起作用,但似乎无法这样做。
我的代码到目前为止(这里我尝试了bindValue,但之前尝试过bindParam并得到了相同的结果):
var_dump($_POST);
$dbh = new PDO ("mysql:host=$myServer;dbname=$myDB", $myUser, $myPw);
$columName = $_POST["columName"];
$tblName = $_POST["tblName"];
$valueName = $_POST["valueName"];
$specificValue = $_POST["specificValue"];
$stmt = $dbh->prepare("SELECT :columName FROM :tblName Where :valueName = :specificValue");
$stmt->bindValue(":columName", $columName);
$stmt->bindValue(":valueName", $valueName);
$stmt->bindValue(":tblName", $tblName);
$stmt->bindValue(":specificValue", $specificValue);
$stmt->execute();
$result = $stmt->fetch();
if(empty($result)){echo "empty";}
print_r ($stmt);
print_r($result);
打印结果和$ stmt带来以下结果:
空 PDOStatement对象([queryString] => SELECT:columName FROM:tblName其中:valueName =:specificValue)
我做错了什么?我有什么办法让它起作用? 我是整个编码的新手,所以请问我是否忘记了任何代码或其他重要信息! 谢谢!
答案 0 :(得分:2)
占位符参数只能代表查询中的 VALUES 。表,字段名,sql关键字等都不可能使用占位符。
如果你需要构建一个动态查询并替换字段/表名,那么你将不得不使用好的旧字符串构造方法,并且要知道你将再次向SQL injection attacks开放:< / p>
$sql = "SELECT * FROM $foo WHERE $bar = :baz";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':baz', $baz);
答案 1 :(得分:1)
我担心您需要重新考虑参数化查询的工作原理。这不仅仅是以安全的方式神奇地插入数据的情况。它是关于查询的结构与数据之间的distingushing。
因此,数据库名称,列名称,表名称和任何SQL关键字都是查询结构的一部分。每次运行查询时,它们都是相同的。
但是,数据可以在运行查询之间发生变化。
因此,在准备查询时,结构需要到位。但是,由于SQL注入原因,您显然不能将$columName
变量等插入查询中。如果你真的需要这样的灵活查询(你可能不这样做),你需要在你的代码中创建一个允许值的白名单,或者从数据库中检索。
答案 2 :(得分:0)
您的查询无效(您正在使用对象标识符的参数),但您没有收到任何通知,因为您既没有配置PDO来抛出异常也没有手动调用错误检查功能。
将PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
选项添加到PDO的构造函数:
$dbh = new PDO ("mysql:host=$myServer;dbname=$myDB", $myUser, $myPw, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
一旦你这样做,你就会在确切的问题上得到一个例外的例外:
PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 ''user'附近'[=]
中第1行的'login'='john''
正如您所看到的,这是尝试运行类似(例如)的查询:
SELECT 'user_id'
FROM 'user'
Where 'login' = 'john'
此外,请注意SQL注入。使用$_POST
中的数据撰写SQL查询非常不安全。