2016-03-02 104 views
0

我想創建一個簡單的PHP腳本來創建和分配給SQL用戶的屬性。查詢工作正常,如果沒有參數使用,但失敗,否則。創建用戶失敗Mysqli準備語句

做工精細

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = "CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password'"; 
$stmt = $conn->prepare($sql); 
$stmt->execute(); 

兩個用戶名和密碼?

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = "CREATE USER '?'@'localhost' IDENTIFIED BY '?'"; 
$stmt = $conn->prepare($sql); 
$uname = "carn"; 
$pass = "pass"; 
$stmt->bind_param('ss', $uname, $pass); 
$stmt->execute(); 

兩個用戶名和密碼都在語法?

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = 'CREATE USER "?"@"localhost" IDENTIFIED BY "?"'; 
$stmt = $conn->prepare($sql); 
$uname = "carn"; 
$pass = "pass"; 
$stmt->bind_param('ss', $uname, $pass); 
$stmt->execute(); 

錯誤,請檢查文檔

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = "CREATE USER [email protected]'localhost' IDENTIFIED BY ?"; 
$stmt = $conn->prepare($sql); 
$uname = "carn"; 
$pass = "pass"; 
$stmt->bind_param('ss', $uname, $pass); 
$stmt->execute(); 

錯誤語法,檢查文件

$conn = new mysqli('127.0.0.1', 'root', 'pass'); 
$sql = "CREATE USER `?`@'localhost' IDENTIFIED BY `?`"; 
$stmt = $conn->prepare($sql); 
$uname = "carn"; 
$pass = "pass"; 
$stmt->bind_param('ss', $uname, $pass); 
$stmt->execute(); 

我不知道在哪裏可以從這裏走。這可能是我使用引號的一個問題,我在這裏看到兩個相關的問題,但沒有一個回答正確。

+0

@ Fred-ii-我說這可能是一個問題,不是我確定的。我嘗試了所有我能想到的組合,對於所有其他查詢,我從不用任何東西來包裝'?',它工作正常,但是'bind_param()'失敗。 – aron9forever

+0

*「可能」*? - 更像「是」。據我所知,佔位符不能有引號和/或剔號。 –

+0

像CREATE TABLE這樣的DDL語句不適用於參數。 'CREATE USER'可能是一樣的。 – JimmyB

回答

1

使用預處理語句,您只能使用有限的查詢子集。創建用戶不包括在內。

您可以嘗試INSERT到mysql.user表,像

INSERT INTO `mysql`.`user` (Host,User,Password)VALUES(?,?,password(?)); 

此外,隨着創建的用戶動態,你正在做的事情錯

+0

所以不可能這樣做?如果所有的名字和密碼都是由我生成的,而不是用戶輸入的,那麼我應該不使用params嗎? – aron9forever

+0

由於沒有用戶輸入,因此決定不帶參數化,用戶名是通過將數字標識附加到單詞中生成的,而密碼只是隨機字母字符。 – aron9forever

1

不要把周圍的?,bind_param單引號()將搞定此事。

但是,還有另一個問題是您不能在MySQL中使用CREATE USER語句的佔位符。請參閱How to write "create user ?" with MySQL prepared statement

+0

謝謝,看第四個例子,我就是這樣寫的,我只是在發佈問題之前嘗試了所有我能想到的引用組合。 – aron9forever