Php 致命错误:未捕获异常';PDO异常';带有消息';SQLSTATE[42000]

Php 致命错误:未捕获异常';PDO异常';带有消息';SQLSTATE[42000],php,mysql,pdo,Php,Mysql,Pdo,我正在从普通SQL迁移到PDO,因为我让我的一个朋友测试我是否有任何弱点,他建议我使用PDO,因为他发现了很多弱点 下面是我的全部错误: 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以获得第54行中“in/home/ubuntu/workspace/post.php”附近使用的正确语法 (!)PDOException:SQLSTATE[42000]:语法错误或访

我正在从普通SQL迁移到PDO,因为我让我的一个朋友测试我是否有任何弱点,他建议我使用PDO,因为他发现了很多弱点

下面是我的全部错误:

致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以获得第54行中“in/home/ubuntu/workspace/post.php”附近使用的正确语法

(!)PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解使用接近“”的正确语法?(
id
title
info\u bys
info\u shorts
info\u longs
email
,”在第54行的/home/ubuntu/workspace/post.php的第1行

这是我的代码:

    $stmt = $db->prepare("INSERT INTO  :portal
    (`id`, `title`, `info_bys`, `info_shorts`, `info_longs`, `email`, `filename`, `filepath`, `filename2`, `filepath2`, `approved`) 
    VALUES ('', ':title', ':by_information', ':short', ':long_information', ':email', ':filename', ':filetarget', ':filename2', ':filetarget2',  'false'");
    $stmt->execute(array(':portal' => $portal, ':title' => $title, ':by_information' => $by_information, ':short' => $short, ':long_information' => $long_information, ':email' => $email, ':filename' => $fileName, ':filetarget' => $fileTarget, ':filename2' => $fileName2, ':filetarget2' => $fileTarget ));
    echo $affected_rows.' were affected';
是否有我不能在PDO中使用的东西可以在SQL中使用,或者我只是输入了错误的东西

希望有人能帮忙

编辑:

新代码:

    function buildQuery( $get_var ) 
{
    switch($get_var)
    {
        case 1:
        $portal = $_POST['portal'];
            break;
    }

                $stmt = $db->prepare("INSERT INTO  :portal
            (`id`, `title`, `info_bys`, `info_shorts`, `info_longs`, `email`, `filename`, `filepath`, `filename2`, `filepath2`, `approved`) 
            VALUES (:title, :by_information, :short, :long_information, :email, :filename, :filetarget, :filename2, :filetarget2,  'false'");
            $stmt->execute(array(':portal' => $portal, ':title' => $title, ':by_information' => $by_information, ':short' => $short, ':long_information' => $long_information, ':email' => $email, ':filename' => $fileName, ':filetarget' => $fileTarget, ':filename2' => $fileName2, ':filetarget2' => $fileTarget ));
            echo $affected_rows.' were affected';
}

守则有三个问题:

  • 正如crhis85(upvote)所述,您不能绑定表名
  • PDO prepare负责转义引号

    值(“”“,”:title“,”:by_information“,”:short“,”:long_information“,”:email“,”:filename“,”:filetarget“,”:filename2“,”:filetarget2“,”false“)

  • 这里的问题是,如果将param定义为字符串(
    PDO::param_STR
    ),则值会用单引号双引号引起来。请改为:

    `VALUES ('', :title, :by_information, :short, ....");`
    
  • 不要插入ID,这应该设置为自动递增,并自动完成

    “插入表格(标题,…”


  • 另外,backticks(``)用于让数据库驱动程序知道您正在使用此值,并且不会用作保留关键字。换句话说,在该查询中完全过时。

    表名无法绑定。您可以创建一个白名单,然后将其与之进行比较。哦,是的,我明白了。我只是个傻瓜。ThanksIt不会返回任何错误,但是它没有给我设置的文本,这是:echo$infected_rows.'were infected';@RikNijdeken将问题更新为您的新代码。@RikNijdeken
    :portal
    仍然需要是
    $portal
    ,在传入之前应该进行检查。
    id
    不应该传入,您应该给出
    已批准的
    一份声明
    false
    @RikNijdeken
    “插入$portal(`title`,…”;
    @RikNijdeken
    $infected\u行定义在哪里?什么是
    $\u POST['portal']