Когда я создаю базу данных без использования параметра bind, он работает отлично.
$login = 'root'; $password = 'root'; $dsn = "mysql:host=localhost"; $opt = array( // any occurring errors wil be thrown as PDOException PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // an SQL command to execute when connecting PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'" ); // Making a new PDO conenction. $conn = new PDO($dsn, $login, $password,$opt); $db = $conn->prepare( 'CREATE SCHEMA IF NOT EXISTS account'); $db->execute(); // End Connection and Return to other files.
Но после применения bindParam он работает неправильно.
$db = $conn->prepare( 'CREATE SCHEMA IF NOT EXISTS ?'); $db->bindParam(1,`account`); $db->execute(); //line 18
Показ ошибки:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1' in /Applications/MAMP/htdocs/create/index.php:18 Stack trace: #0 /Applications/MAMP/htdocs/create/index.php(18): PDOStatement->execute() #1 {main} thrown in /Applications/MAMP/htdocs/create/index.php on line 18
ОБНОВИТЬ:
<?php $login = 'root'; // Login username of server host. $password = 'root'; // Password of server host. $dsn = "mysql:host=localhost"; // Set up a DSN for connection with Database Frat. $dbb = 'sale'; $opt = array( // any occurring errors wil be thrown as PDOException PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // an SQL command to execute when connecting PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'" ); // Making a new PDO conenction. $conn = new PDO($dsn, $login, $password,$opt); $db = $conn->prepare( 'CREATE SCHEMA IF NOT EXISTS ?'); $db->bindParam(1,'$dbb'); //line 17 $db->execute(); ?>
он показывает ошибку: не может передать параметр 2 по ссылке в строке 17
Здесь есть две большие проблемы. Первый – незначительный. Эти строки кода никогда не будут работать:
$db->bindParam(1,`account`); $db->bindParam(1,'$dbb'); //line 17
Это связано с тем, что оба они пытаются вызвать bindParam
как строку . Это невозможно. bindParam
нуждается в ссылке на переменную. Вот почему вы получаете сообщение «can not pass parameter 2 by reference»: вы можете передавать только переменные по ссылке.
Однако любой из них будет работать:
$db->bindParam(1, $dbb); // call bindParam on a variable $db->bindValue(1, 'account'); // call bindValue on a string literal
Однако более фундаментальная проблема заключается в том, что вы понимаете подготовленные заявления. Идея подготовленных операторов – не простая подстановка строк в другую строку. Это принципиально об отделении структуры запроса от данных. Имя таблицы считается частью структуры запроса, а не частью данных. Вы должны поместить имя таблицы в исходный запрос. Ваш первый код – это способ сделать это.
$db = $conn->prepare( 'CREATE SCHEMA IF NOT EXISTS account');