2013-07-11 51 views
1

當我不使用綁定參數創建數據庫時,它完美地工作。用php創建數據庫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

現在我不使用反引號爲什麼它仍然顯示錯誤。 – Pankaj

回答

3

這裏有兩個大問題。第一個是次要的。這些代碼行不會有任何效果:

$db->bindParam(1,`account`); 
$db->bindParam(1,'$dbb'); //line 17 

這是因爲他們都嘗試呼叫bindParam字符串。這是不可能的。 bindParam需要一個變量的引用。這就是爲什麼你得到一個「不能通過參考2參考」的錯誤:你只能通過變量作爲參考。

這些不是,但是,將工作:

$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

是否意味着我們不能在創建模式時使用綁定參數。 – Pankaj

+0

@Sarah是的。我真的不明白你爲什麼想要。 – lonesomeday

+0

我只想檢查它... thks – Pankaj