2013-05-02 133 views
-1

我想要一個帶有變量的MySQL查詢表。這裏是我正在尋找的:我可以在MySQL查詢中使用變量作爲表名嗎?

​​

我該怎麼做?如果你想array轉換爲string在PHP中,使用implode(sep,arr)功能

mysql_query("SELECT * FROM " . $var . " WHERE " . $anothervar . " ='1'")) 
+2

要細,是 – martincarlin87 2013-05-02 12:10:03

+0

您的問題到底是什麼 – Borniet 2013-05-02 12:10:05

+1

您是否嘗試過運行代碼?您是否遇到任何錯誤? – shyam 2013-05-02 12:10:25

回答

-3

你應該使用這樣的事情。 如果您$var是表名或類似的東西,那麼array

mysql_query("SELECT * FROM ". implode(',',$var) ." WHERE $anothervar ='1'") 

注意:如果您的表名是相同的mysql關鍵字,該代碼將無法正常工作。 因此,爲了防止這種情況,改變這樣的代碼:

所有的
mysql_query("SELECT * FROM `". implode('`,`',$var) ."` WHERE `$anothervar` ='1'") 
+1

這與OP的代碼完全相同,因爲PHP擴展了雙引號所包圍的字符串中的所有變量。 (http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing) – 2013-05-02 12:25:09

+0

@JensWegar:你試過了嗎?它工作正常。 – urframes 2013-05-02 12:28:10

+0

您發佈的代碼沒有問題,只是運行代碼的最終結果與原始問題中的代碼完全相同。因此,不幸的是,你的答案並沒有帶來任何新的東西。 – 2013-05-02 12:47:07

3

首先,停止使用mysql_功能。他們已被棄用。退房mysqliPDO

使用PHP查詢數據庫時,可以根據需要構建整個查詢。您可以輸入完整查詢或爲更多動態查詢添加變量。你所做的是正確的(除了右邊的雙括號)。

<?php 
$query = "SELECT * FROM users WHERE id ='1'"; 

//the above will be the same as 

$var = 'users'; 
$anothervar = 'id'; 
$query = "SELECT * FROM $var WHERE $anothervar ='1'"; 

//execute query. 
?> 

所以是的,你可以在PHP中構建查詢時使用變量表名稱。你需要記住你使用的所有變量都可以導致SQL注入。因此,如果您從用戶輸入中獲取表名和列名的值,請確保正確驗證它們!

僅使用mysql_real_escape_string()mysqli_real_escape_string()將不會在表和列名稱上工作,因爲它們未用引號引起來。如果您收到用戶對列/表的輸入並將查詢連接起來,我的投票將用於白名單。 EG:

<?php 
$allowed_tables = array("users", "articles", "messages"); 

if (!in_array($var, $allowed_tables)) { 
    echo 'Invalid table'; 
    exit(); 
} 
?> 

另一個好讀是how-to-prevent-sql-injection-in-php也進入參數化查詢,這基本上是你想做的事,但後來在一個更安全的方式,然後連接字符串。

+0

downvotes?請解釋。 – 2013-05-15 05:53:09

1

你會討厭我的答案,但我真的相信這是正確的(如果不是直接的)。

如果可能的話,我會避免這種方法(或者至少可以確保您清理您的'輸入')。在不知道這些變量來自哪裏的情況下,我會說你已經開放給SQL注入攻擊。當然,通過參數化創建動態sql更加困難,但如果您能以任何其他方式解決此問題,請執行此操作。

要編寫更多代碼或者有一個不太優雅的解決方案比擁有一個漂亮的代碼庫和一扇敞開的大門讓好奇的人能夠訪問您的dbms更好。

另外作爲一種做法,我會考慮使用存儲過程,以支持內聯sql。這將使您的sql更容易維護,併爲您提供更好的靈活性。通過存儲過程來完成你想要的任務的方法是在過程中動態地創建一個準備好的語句,但是這會讓你面臨與你現在嘗試執行相同的SQL注入風險相同的風險。

+0

好的,我看到你討厭我的回答,所以我回來了。你發佈的是一個可行的解決方案,所以我不認爲有人確定你在這裏尋找什麼。我上面回答的原因是因爲你實施這個方式顯然會「工作」,所以我決定深入研究以這種方式實現解決方案到你的問題的「應該」的問題。我認爲我支持我的觀點反對你的設計非常好(並且給出了一些關於如何更好地實現這一點的建議;我只爲你寫了代碼),那麼爲什麼倒票呢? – Dave 2013-05-16 02:36:46

2

寫您的SQL查詢作爲

mysql_query("SELECT * FROM $var WHERE anothervar ='1'"); 

你已經把額外的括號沒有分號,我相信這絕對welll工作。

+1

爲什麼這會得到提升?代碼看起來壞了......我添加了缺少的引號。 – MMM 2013-05-15 10:04:07

0

您的查詢結果正常。只有一個額外的括號。請嘗試使用下面的代碼。

mysql_query("SELECT * FROM $var WHERE $anothervar ='1'"); 
0
mysql_query("SELECT * FROM $var WHERE $anothervar ='1'")); // TYPO ERR )) 


mysql_query("SELECT * FROM $var WHERE $anothervar ='1'"); 

IF $ VAR,$ anothervar已經確定,並得到錯誤..TRY

mysql_query("SELECT * FROM `$var` WHERE `$anothervar` ='1'"); 

** mysqli is good 
0

除了什麼其他的答案都表示,如果是$ var或者$ anothervar可能sql中的保留字,那麼它們應該被反引號包圍。

"SELECT * FROM是$ var $ WHERE anothervar` = '1'」

我@Hugo同意,你應該有$ var和$ anothervar允許值的白名單。

相關問題