2015-04-28 31 views
0

我正在使用這個sql查詢作爲PHP腳本的一部分來接受用戶輸入(應用於變量$ condition1- $ condition4),並將其與MySQL數據庫進行比較並返回相關結果。SQL查詢'WHERE EXISTS'如果列返回空

我的問題是,並非網站上的所有表單都輸出$ condition4值,因此它並不總是輸入到腳本/查詢中。

我試過在SQL查詢中使用EXISTS謂詞,但無法讓它工作。

下面是該查詢,因爲我有它的工作:

$sql = "SELECT columnXYZ 
    FROM table_1 
    WHERE condition1 = '" .$condition1."' 
    and condition2 = '" .$condition2."' 
    and condition3 = '" .$condition3."' 
    and condition4 = '".$condition4."'"; 

我需要確定是否$ condition4是我運行查詢之前或輸入有使用WHERE的方式EXISTS謂詞來實現這一目標?

整個腳本:(的var_dump看到查詢的結果)

<?php 
$condition1 = $_POST['condition1']; 
$condition2 = $_POST['condition2']; 
$condition3 = $_POST['condition3']; 
$condition4 = $_POST['condition4']; 
$dbhost = 'localhost'; 
$dbuser = 'admin'; 
$dbpass = 'pwd'; 
$conn = mysql_connect($dbhost, $dbuser, $dbpass); 

if(! $conn) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 
$sql = "SELECT columnXYZ 
     FROM table_1 
     WHERE condition1 = '" .$condition1."' 
     and condition2 = '" .$condition2."' 
     and condition3 = '" .$condition3."' 
     and condition4 = '".$condition4."'"; 

mysql_select_db('database_1'); 
$retval = mysql_query($sql, $conn); 
if(! $retval) 
{ 
    die('Could not get data: ' . mysql_error()); 
} 
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) 
{ 
    $columnXYZ = $row['columnXYZ']; 
    var_dump($columnXYZ); 
} 



mysql_close($conn); 
?> 

當$ condition4輸入的查詢工作正常,作爲一個變通的形式沒有一個$ condition4我有剛剛指向一個類似的PHP腳本,刪除了$ condition4。

澄清我的問題:我可以在SQL查詢中使用EXISTS謂詞來確定輸入是否有值,或者是否需要事先使用PHP或其他某種方法執行此操作?

+2

請參閱[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)和[MySQL的棄用(http://php.net/manual/en/migration55.deprecated .PHP)。另外[MySQLi](http://php.net/manual/en/book.mysqli.php) –

+1

此代碼對SQL注入黑客開放。當您將數據(例如:GET,POST等)放入查詢中時,必須對其進行消毒。請使用PDO和參數化查詢來查找,以防止人們攻擊您的代碼。 – TravisO

+2

[你需要防止SQL注入!](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) 請[停止使用'mysql_ *'函數](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)。他們不再被維護,並[正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。瞭解[準備的陳述](http://en.wikipedia.org/wiki/Prepared_statement),並使用[PDO](http://jayblanchard.net/demystifying_php_pdo.html)。 –

回答

4

只需在將條件添加到SQL查詢之前檢查$ condition4是否爲空()。

$sql = "SELECT columnXYZ 
    FROM table_1 
    WHERE condition1 = '" .$condition1."' 
    and condition2 = '" .$condition2."' 
    and condition3 = '" .$condition3."'"; 

if !(empty($condition4)){ 
    $sql .= "' and condition4 = '".$condition4."'"; 
} 

正如賽斯提到,谷歌的「SQL注入」如果你打算把公共互聯網這附近的任何地方。

+2

真的應該在這裏提及清理數據/ sql注入 –

+0

謝謝,我沒有意識到我可以用'if'語句'插入'這樣的查詢。非常感謝這澄清了事情。 –

+1

@VaultDweller只是一個FYI'。'在PHP中用於連接,這樣你就可以做任何你想做的事情。超級有用的工具:D –

1

使用empty()進行檢查時,$ condition4的值可能爲空,因爲空允許NULL值。我仍然在學習PHP;然而,isset()會是一個更好的方法嗎?否則可能有條件4 =空

也作爲該人對你的文章發表評論,請記住在將它放入sql查詢或其他地方之前驗證所有用戶輸入。

http://php.net/manual/en/function.isset.php

+0

即時搜索清理數據/ sql注入Seth T建議。有小費嗎? –

+2

如果值沒有設置,empty()將返回true,null,空字符串等,這是我假設我們將在這種情況下想要的。如果'條件'匹配沒有用處,請不要包含查詢的那部分 – Loopo

+0

@VaultDweller我已經用mysql_real_escape_string和其他清理方法辛苦了;然而,正如傑伊布蘭查德所說,研究PDO(這也是我會做的) – Worldgorger