Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO类-语法错误或访问冲突1064_Php_Mysql_Class_Pdo - Fatal编程技术网

Php PDO类-语法错误或访问冲突1064

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){

我正在创建一个用于连接数据库的类,但我不断收到一条消息,说我的sql语法有错误,在回显查询时,我从:table where:row=:value中获取了
选择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"));