2016-11-18 228 views
1

我正在使用PDO擴展從PHP連接到MariaDB數據庫。我想知道如何轉義連接字符串中使用的特殊字符。如何轉義PDO連接字符串中的特殊字符?

明顯的嘗試(URL編碼,用單引號括起來)都失敗了。

我目前不需要連接到例如一個奇怪的數據庫,但我想知道如果我做的。

具體做法是:假設我有下面的PHP代碼

<?php 
$username = 'some user'; 
$password = 'some password'; 
$host = 'dummy.example.com'; 
$port = 1 << 16; 
$dbname= 'alpha;a=b'; 
$PDO = new PDO("mysql:host=$host;port=$port;dbname=$dbname", 
       $username, $password, []); 

因爲$dbname分號被解釋爲元字符這是行不通的。我想知道如何逃避這個角色。

+0

你試過'$ dbname ='alpha \; a = b';'? –

+0

我不認爲任何人都會使用特殊字符作爲數據庫名稱 - 如果它甚至被允許的話。至少 - 還有,UTF編碼和定期轉義應該照顧這個? –

+5

btw,變量不會在單引號中被解析''mysql:host = $ host; port = $ port; dbname = $ dbname''。 SooOOoooo'「mysql:host = $ host; port = $ port; dbname = $ dbname」'。可能是這裏的重頭戲。 –

回答

2

如果出於某種奇怪的原因需要這樣做,請不要在dns中使用dbname參數。相反,使用你的數據庫驅動程序,選擇它爲您:

$dbh->query('use "newdatabase"'); // for mysql. 

這樣一來,你有"附上數據庫名稱的選項,這樣你就可以將其命名無論司機允許。對於這種特定情況下的MySQL,它是"字符,但這並不意味着PostgreSQL或Firebase的不同。

但這種方法是不是防彈的,它只允許PDO庫來解析DSN正常的,因爲我不希望 PDO庫來應對這種不尋常的情況作爲其唯一的目的就是儘可能多的互動儘可能的司機。

驅動程序特定的配額不應該參與到PDO中,所以您應該向驅動程序詢問這一點,這樣您還可以檢查查詢是否無法執行。

0

數據庫,表格或列名稱可以(並且應該在你的情況下)爲,帶有backtics(`a = b`)的引用

但是,這可能是不夠的。 ;在幾種情況下是重要的人物;背景可能不夠。 「真正的解決辦法」是堅持使用這些名字的字母,數字和下劃線。

Xorifelse的答案指出了一種可能的情況,即反演不足。