Php PDO类-语法错误或访问冲突1064
我正在创建一个用于连接数据库的类,但我不断收到一条消息,说我的sql语法有错误,在回显查询时,我从:table where:row=:value中获取了Php PDO类-语法错误或访问冲突1064,php,mysql,class,pdo,Php,Mysql,Class,Pdo,我正在创建一个用于连接数据库的类,但我不断收到一条消息,说我的sql语法有错误,在回显查询时,我从:table where:row=:value中获取了选择id,username from:table,它似乎没有错误 <?php class db{ protected $datab; public function __construct($username, $password, $host, $dbname, $options){
选择id,username from:table,它似乎没有错误
<?php
class db{
protected $datab;
public function __construct($username, $password, $host, $dbname, $options){
try {
$this->datab = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options);
}
catch(PDOException $ex) {
die("Failed to connect to the database: " . $ex->getMessage());
}
$this->datab->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->datab->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
public function select($array, $table, $row, $value){
$query = "SELECT";
foreach($array as $val) {
if ($val === end($array)){
$query.= " ".$val;
}else{
$query.= " ".$val.",";
}
}
$query.=" FROM :table WHERE :row = :value";
$query_params = array(
':table' => $table,
':row' => $row,
':value' => $value
);
echo $query; // SELECT id, username from :table where :row = :value
try{
$stmt = $this->datab->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex) {
die("Failed to run query: " . $ex->getMessage());
}
$row = $stmt->fetch();
return $row;
}
}
$kit = new db("root", "", "localhost", "kit", array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
$kit->select(array("id", "username"), "user", "username", "yusaf");
?>
错误消息:
无法运行query:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行“user”(其中“username”=“yusaf”)附近使用的正确语法
编辑
我投了反对票,请评论一下你为什么给我这个。
我想我应该提到这只是为了学习,我实际上不打算在应用程序中使用这个类,它是毫无意义的。你不能使用:table或:row作为替换值,你必须知道表和列的名称
从:table中选择id、用户名,其中:row=:value
应该是
从tablename中选择id、username,其中columnname=:value替换将:table和:row替换为带引号的值,结果是:
SELECT id, username FROM 'user' WHERE 'username' = 'yusaf'
应该是什么时候
SELECT id, username FROM user WHERE username = 'yusaf'
更改此行:
$query.=" FROM :table WHERE :row = :value";
致:
你的select()
功能完全没有用。
听着,你在试着给自己留两个词,从哪里来。在exchange中,您将失去SQL的灵活性和可读性。对一种有问题的糖来说,价格太高了。如果您需要订货怎么办?参加复杂的地方?更不用说你实际上是在混淆简单易读的SQL。有这样的功能纯粹是胡说八道
它必须是什么:
public function getRow($query, $params){
$stmt = $this->datab->prepare($query);
return $stmt->execute($params)->fetch();
}
因此,它可以用作
$row = $kit->getRow("SELECT id, username FROM user WHERE username =?", array("yusaf"));
答案是:此解决方案易受SQL注入攻击PDO负责值的SQL注入,如果要使用动态数据,必须自己清理表和列名称。显然,如果列的表名来自客户机数据,那么如果您没有清理变量,则此代码将很容易受到攻击,但这里没有迹象表明情况确实如此。解决方案要么是无懈可击的,要么不是。你的不是。这就是全部。借口是用来说话的,而不是用来保护。如中所述,如果您想使用动态表名和列名,您必须确保您的数据已被清除。在PDO中没有包装器为您这样做。如果你不懂PHP,请不要投票,谢谢。哈哈,我不是真的要用这个,我正在学习OOP,只是感觉像合并了一个数据库!!!
$row = $kit->getRow("SELECT id, username FROM user WHERE username =?", array("yusaf"));