2013-07-11 5 views
1

Когда я создаю базу данных без использования параметра bind, она отлично работает.создать базу данных с pdo в php

$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

UPDATE:

<?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

+1

Почему вы хотите использовать параметр при создании схемы? –

+0

Не используйте обратные ссылки в 'bindParam'. – str

+0

теперь я не использую backticks, почему он все еще показывает ошибку. – Pankaj

ответ

3

Здесь есть две большие проблемы. Первый - незначительный. Эти строки кода никогда не будет работать:

$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'); 
+0

означает, что мы не можем использовать параметр bind в создании схемы. – Pankaj

+0

@Sarah Да. Я действительно не понимаю, зачем вам это нужно. – lonesomeday

+0

Я просто хочу проверить это ... thks – Pankaj

Смежные вопросы