используйте heredoc для ввода sql и при привязке var получите ошибку

я пишу этот код для запроса

    $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;

и используйте mysqli для подключения и выполнения моего запроса с привязкой значения в первой строке моего запроса.

$con = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
        $exe = $con->prepare($tableQuery_comment);
        $exe->bind_param(1, $tablePrefix);
        $exe->execute();

и получить ошибку в этой строке

$exe->bind_param(1, $tablePrefix);

Ошибка :

mysqli_stmt::bind_param(): количество переменных не соответствует количеству параметров в подготовленном операторе

я пытаюсь связать параметр :name, как этот код (при использовании этого оператора измените? подпишите на: tablePrefix)

$exe->bind_param(':tablePrefix', $tablePrefix);

и этот код

$exe->bind_param('s', $tablePrefix);

но получить и получить снова ту же ошибку

что мне делать, чтобы связать параметр в heredoc с mysqli?


person Death Programmer    schedule 27.01.2014    source источник
comment
mysqli не поддерживает именованные параметры. Вы путаете mysqli с PDO.   -  person Barmar    schedule 28.01.2014
comment
Кроме того, вы не можете использовать привязку параметров для имен таблиц и столбцов. Их можно использовать только в тех местах, где разрешено выражение.   -  person Barmar    schedule 28.01.2014
comment
в этой ссылке используйте mysqli и значение привязки   -  person Death Programmer    schedule 28.01.2014
comment
В примере PDO используется :name, в примере mysqli используется ?, а не ?name.   -  person Barmar    schedule 28.01.2014
comment
затем я проверяю руководство и добавляю в команду sql?   -  person Death Programmer    schedule 28.01.2014
comment
Я не понимаю этот вопрос.   -  person Barmar    schedule 28.01.2014
comment
сори за нуб английский. я написал страницу установки cms :), например wordpress, и пользователь может ввести префикс таблицы. поэтому, если пользователь вводит символ, например '` или любой другой неправильный символ, как исправить этот символ?   -  person Death Programmer    schedule 28.01.2014


Ответы (1)


Вы не можете использовать параметры для имен таблиц и столбцов, только там, где разрешены выражения. Таким образом, вы должны использовать замену строки для этого:

    $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;
person Barmar    schedule 27.01.2014
comment
правильно, но если пользователь вводит букву типа `или' или ..., у меня есть запрос на ввод. правильно? - person Death Programmer; 28.01.2014
comment
да. Вы не можете использовать bind_param для предотвращения инъекции, когда вам нужно заменить имя таблицы. - person Barmar; 28.01.2014