2013-06-27 88 views
0

我想學習如何動態生成一個基於用戶選擇填寫數據的表單字段的MySQL查詢。爲了使學習過程儘可能地簡單,我使用了一個帶有用戶名和姓氏字段的簡單表單。代碼的基本(非動態)版本如下:動態生成mysql的查詢與PHP

<html> 
<head> 

<title>Untitled</title> 

</head> 
<body> 

<form method="post" name="test" action="dynamic_search.php"> 
<input type="text" name="first_name"> 
<input type="text" name="last_name"> 
<input type="submit" value="Submit"> 

</form> 

<?php 

$first_name = $_POST['first_name']; 
$last_name = $_POST['last_name']; 

include "link.php"; 

$query = "SELECT * FROM members " . 
    "WHERE first_name = '$first_name' " . 
    "AND last_name = '$last_name' "; 

$result = mysql_query($query) 
or die(mysql_error()); 

$row = mysql_fetch_array($result); 
$member_id = $row['member_id']; 
$member_first_name = $row['first_name']; 
$member_last_name = $row['last_name']; 

echo $member_id; 
echo $member_first_name; 
echo $member_last_name; 

?> 
</body> 
</html> 

我需要能夠做的是基於提交的數據的查詢。因此,如果用戶只輸入他們的名字的查詢將作爲閱讀:

$query = "SELECT * FROM members " . 
    "WHERE first_name = '$first_name' "; 

但是,如果用戶輸入兩個他們的第一個和最後一個名字的查詢將作爲閱讀:

$query = "SELECT * FROM members " . 
    "WHERE first_name = '$first_name' " . 
    "AND last_name = '$last_name' "; 

任何幫助(或如果有人能指點我一個很好的教程)將不勝感激!

謝謝!

+0

請讀了[SQL注入](http://en.wikipedia.org/wiki/SQL_injection) – Kibbee

回答

0

一種選擇是檢查空白:

$query = "SELECT * FROM members " . 
    "WHERE ('$first_name' = '' OR first_name = '$first_name') " . 
    "AND ('$last_name' = '' OR last_name = '$last_name') "; 

通過這種方式,它會如果FIRST_NAME是空白,例如(只是確保你的括號中恰當地寫入)等於真。

+0

這隻有在數據庫中的名字或姓氏記錄爲空時纔有效。但是,謝謝 –

+1

@matttuman - 爲什麼?如果$ first_name爲空 - 傳入的變量,這應該起作用。 – user2480596

+0

如果用戶輸入名字Nick但不輸入他們的姓氏,則將搜索包含名字Nick和姓氏空的記錄。 。在這種情況下,我想要一個只能搜索名字相同的名字的查詢 –

1

您可以使用PHP來檢查輸入並在需要時追加到查詢中。

$query = "SELECT * FROM members "; 
$query .= "WHERE first_name = '$first_name' "; 
if($last_name!="") 
    $query .="AND last_name = '$last_name' "; 

記住我的使用real_escape_string

$first_name = mysql_real_escape_string($_POST['first_name']); 

如果你要檢查的第一個名字逃離字符串:

$query = "SELECT * FROM members "; 
if($first_name!=""){ 
    $query .= "WHERE first_name = '$first_name' "; 
    if($last_name!="") 
     $query .="AND last_name = '$last_name' "; 
} 
else{ 
    if($last_name!="") 
     $query .="WHERE last_name = '$last_name' "; 
} 
+0

太棒了!我猜我可以繼續添加if語句來更復雜的表單嗎? –

+0

是的,你可以,只要記住你的投入的衛生。 –

+0

雖然,如果用戶做相反的事,並填寫他們的姓氏,同時留下他們的名字空白我會有同樣的問題。 –

1

首先,don't use mysql_* functions in new code。他們不再維護and are officially deprecated。看到red box?請改爲了解prepared statements,並使用PDOMySQLi - this article將幫助您決定哪個。如果您選擇PDO,here is a good tutorial。 (Credit

二,a caution to always escape user input being included in an SQL statement。準備好的語句自動處理這個。

說了這麼多,你以後是PHP的邏輯是這樣的:

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

$first_name = $mysqli->real_escape_string($_POST['first_name']); 
$last_name = $mysqli->real_escape_string($_POST['last_name']); 

$sql = "SELECT * FROM members WHERE 1"; 
if (! empty($first_name)) { 
    $sql .= " AND first_name = '$first_name'"; 
} 
if (! empty($last_name)) { 
    $sql .= " AND last_name = '$last_name'"; 
} 
+0

非常感謝!我一定會檢查你建議的資源! –