繁体   English   中英

PHP PDO语法问题?

[英]PHP PDO syntax issue?

我在这段代码中遇到了麻烦,并且找不到任何错误:

$query = "CREATE TABLE ? (? INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(?), ? VARCHAR(30), ? VARCHAR(50), ? TIMESTAMP, ? VARCHAR(50), ? DECIMAL(15, 2), ? DECIMAL(3, 2), ? VARCHAR(255))";
$array = array($table_name, $id, $id, $a_title, $c_title, $date_updated_title, $s_title, $ds_title, $ps_title, $u_title);

    try {
        $results = db_query($db, $query, $array); // db_query() is my PDO function to query the database. This function works fine elsewhere.
        echo($table_name . " create successfully!");
    } catch (PDOException $e) {
        echo('<br />Could not create table "' . $table_name . '".');
        return false;
        error($e); //error() is my function to write errors to my log, and works fine elsewhere.
    }

当我在浏览器中运行它时,它返回捕获的异常“无法创建表“名称”。 但是,我在日志中没有看到任何错误,因此我不知道这是语法问题还是什么。

当我接受查询本身,并用实际值替换问号,并将其转储到PHPMyAdmin中时,它会很好地创建表。 我不太确定这是什么问题。 我在其他站点上使用PDO取得了合理的成功,但我还是相对较新。 有任何想法吗?

谢谢您的帮助!

[编辑]此后,我尝试使用以下查询:

"CREATE TABLE $a_title (? INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(?), ? VARCHAR(30), ? VARCHAR(50), ? TIMESTAMP, ? VARCHAR(50), ? DECIMAL(15, 2), ? DECIMAL(3, 2), ? VARCHAR(255))";

我已经尝试了单引号和双引号。 我还从数组中删除了$ table_name变量。 仍然出现语法错误,不确定原因。

@DCoder的注释正确。 只能在通常可以放置单个字符串文字,日期文字或数字文字的位置使用查询参数

您不能将查询参数用于:

  • 表名

    错误: SELECT * FROM ?

  • 列名

    错误: SELECT * FROM table WHERE ? = 1234 SELECT * FROM table WHERE ? = 1234

  • 值清单

    错误: SELECT * FROM table WHERE column IN (?)

    尽管可以将IN()与参数占位符列表一起使用,但每个标量值都使用一个。

  • SQL运算符,表达式或关键字

    错误: SELECT * FROM table WHERE column ? 'value' AND ? ORDER BY column ? SELECT * FROM table WHERE column ? 'value' AND ? ORDER BY column ?

在这种情况下,如果您希望动态内容成为查询的一部分,则调用prepare() 之前 ,该内容必须成为查询的一部分。

但是,这意味着您要回到将变量插值到SQL查询字符串中的方式,因为SQL注入风险告诉我们,这是不可以的。

解决方案是使用过滤和列入白名单,以确保内容中不包含某些不安全的内容。 例如,如果它是一个动态表名,则除去您想保留的字符以外的任何内容,然后再分隔表名,以防万一有人将其表命名为“ table”或“ order”之类的保留字。

$table = preg_replace("/[^\w]/", "", $table);
$sql = "CREATE TABLE `{$table}` ( ... )";

发表您的评论:

是的,列名也已超出限制。 正如我在顶部所说的,参数仅用于标量值。

您还需要学习三种不同类型的引号的正确用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM