2014-07-15 48 views
-1

我想運行一個語句來創建一個數據庫和一個用戶,但它似乎laravel繼續運行奇怪的查詢。我的代碼如下:如何準備與Laravel語句

$res = DB::statement("CREATE DATABASE IF NOT EXISTS `?`", array($databaseName)); 
$res2 = DB::statement("CREATE USER '?'@'%' IDENTIFIED BY '?'", array($databaseName, $password)); 
return $res . " - " . $res2; 

我預計要創建的數據庫和一個「真」的結果,但查詢還是給了我一個錯誤的響應,沒有創建數據庫。試圖用「髒方式」在查詢內部運行一個帶有$ databaseName變量的語句,所以我認爲準備語句有問題。這將是正確的做法嗎?

謝謝! :)

更新: 我設法做到了,但它似乎仍然存在SQL注入問題,因爲我仍然無法使用預準備語句。我發現的第一個解決方案是以下之一:

$res = DB::statement("CREATE DATABASE IF NOT EXISTS `{$databaseName}`"); 
$res2 = DB::statement("CREATE USER '{$databaseName}'@'%' IDENTIFIED BY '{$password}'"); 
return $res . " - " . $res2; 
+0

我相信你的綁定是自動引用的,所以可能有可能你剛剛創建了數據庫''db_name''並帶有引號。那個創建了嗎? – user3158900

+0

不是在這種情況下,而是使用變量(如\'?\')您是對的:它們被引用並且生成的查詢導致數據庫名稱格式錯誤。 例如: 'DB ::聲明( 「CREATE USER @ '%' IDENTIFIED BY '?' '?'」,數組($的databaseName,$ databasePassword));' 是不是有辦法修理它? –

回答

0

下面的代碼我發現,工作原理:

DB::connection('database')->statement("CREATE USER '{$mysqlDatabaseName}'@'%' IDENTIFIED BY '{$mysqlUserPassword}'"); 
DB::connection('database')->statement("CREATE DATABASE IF NOT EXISTS `{$mysqlDatabaseName}`"); 
DB::connection('database')->statement("GRANT ALL PRIVILEGES ON `{$mysqlDatabaseName}`.* TO '{$mysqlDatabaseName}'@'%'"); 

然而,在運行這些查詢之前,你必須確保你有代碼中沒有SQL注入。

希望這會幫助別人! :)

+1

它幫助,我像你一樣,沒有辦法使這項工作,試用不含引號,嘗試命名參數(:ID)......等只有你的解決方案工作。這是一個錯誤嗎? –

+0

我不確定這是否是你應該處理它的方式,但說實話,因爲它的工作我不再關心它。是的,這不是一個乾淨的解決方案,但現在它不是一個巨大的交易:) –