Php 使用heredoc输入sql,当绑定变量时,获取错误

Php 使用heredoc输入sql,当绑定变量时,获取错误,php,mysqli,bind,heredoc,Php,Mysqli,Bind,Heredoc,我写这段代码是为了查询 $tableQuery_comment = <<<query CREATE TABLE IF NOT EXISTS `?comment` ( `cmt_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `cmt_obj_id`

我写这段代码是为了查询

    $tableQuery_comment = <<<query
                            CREATE TABLE IF NOT EXISTS `?comment` (
                              `cmt_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
                              `cmt_obj_id` bigint(20) NOT NULL DEFAULT '0',
                              `cmt_author_name` tinytext NOT NULL,
                              `cmt_author_email` varchar(100) NOT NULL DEFAULT '',
                              `cmt_author_url` varchar(200) NOT NULL DEFAULT '',
                              `cmt_author_ip` varchar(100) NOT NULL DEFAULT '',
                              `cmt_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
                              `cmt_content` text NOT NULL,
                              `cmt_approve` varchar(20) NOT NULL DEFAULT 'yes',
                              `cmt_agent` varchar(255) NOT NULL DEFAULT '',
                              `cmt_parent` bigint(20) NOT NULL DEFAULT '0',
                              `user_id` bigint(20) NOT NULL DEFAULT '0',
                              PRIMARY KEY (`cmt_id`),
                              KEY `cmt_obj_id` (`cmt_obj_id`),
                              KEY `cmt_parent` (`cmt_parent`),
                              KEY `user_id` (`user_id`)
                            )
query;
并在这一行中获取错误

$exe->bind_param(1, $tablePrefix);
错误:

mysqli_stmt::bind_param():变量数与 准备语句中的参数

我尝试像下面的代码一样绑定
:name
参数 (使用此语句时更改?签名为:tablePrefix)

这个密码呢

$exe->bind_param('s', $tablePrefix);
但是得到并再次得到相同的错误


如何将herdoc中的参数与mysqli绑定?

只有在允许使用表达式的情况下,才能将参数用于表名和列名。因此,必须使用字符串替换:

    $tableQuery_comment = <<<query
                            CREATE TABLE IF NOT EXISTS `{$tablePrefix}comment` (
                              `cmt_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
                              `cmt_obj_id` bigint(20) NOT NULL DEFAULT '0',
                              `cmt_author_name` tinytext NOT NULL,
                              `cmt_author_email` varchar(100) NOT NULL DEFAULT '',
                              `cmt_author_url` varchar(200) NOT NULL DEFAULT '',
                              `cmt_author_ip` varchar(100) NOT NULL DEFAULT '',
                              `cmt_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
                              `cmt_content` text NOT NULL,
                              `cmt_approve` varchar(20) NOT NULL DEFAULT 'yes',
                              `cmt_agent` varchar(255) NOT NULL DEFAULT '',
                              `cmt_parent` bigint(20) NOT NULL DEFAULT '0',
                              `user_id` bigint(20) NOT NULL DEFAULT '0',
                              PRIMARY KEY (`cmt_id`),
                              KEY `cmt_obj_id` (`cmt_obj_id`),
                              KEY `cmt_parent` (`cmt_parent`),
                              KEY `user_id` (`user_id`)
                            )
query;

$tableQuery\u comment=
mysqli
不支持命名参数。您将
mysqli
PDO
混淆。此外,您不能对表名和列名使用参数绑定。它们只能在允许表达式的地方使用。在本例中使用mysqli和bind value在PDO示例中它使用
:name
,在mysqli示例中它使用
,而不是
?name
。然后我检查手册并添加到sql命令?正确,但如果用户输入类似“or”或,我有一个疑问。对吧?对。当需要替换到表名中时,不能使用
bind_param
来阻止注入。
$exe->bind_param('s', $tablePrefix);
    $tableQuery_comment = <<<query
                            CREATE TABLE IF NOT EXISTS `{$tablePrefix}comment` (
                              `cmt_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
                              `cmt_obj_id` bigint(20) NOT NULL DEFAULT '0',
                              `cmt_author_name` tinytext NOT NULL,
                              `cmt_author_email` varchar(100) NOT NULL DEFAULT '',
                              `cmt_author_url` varchar(200) NOT NULL DEFAULT '',
                              `cmt_author_ip` varchar(100) NOT NULL DEFAULT '',
                              `cmt_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
                              `cmt_content` text NOT NULL,
                              `cmt_approve` varchar(20) NOT NULL DEFAULT 'yes',
                              `cmt_agent` varchar(255) NOT NULL DEFAULT '',
                              `cmt_parent` bigint(20) NOT NULL DEFAULT '0',
                              `user_id` bigint(20) NOT NULL DEFAULT '0',
                              PRIMARY KEY (`cmt_id`),
                              KEY `cmt_obj_id` (`cmt_obj_id`),
                              KEY `cmt_parent` (`cmt_parent`),
                              KEY `user_id` (`user_id`)
                            )
query;