iT邦幫忙

0

關於 MySql 【搜尋】語法的提問

union9999 1 年前1517 瀏覽

正常搜尋語法:
<?
$no= $_POST['no'];
if ($_POST['no'])
{
$sql="select * from work where no= '$no'";
}
?>

我的問題:
<?
$no= $_POST['no'];
$no1= $_POST['no1'];
$no2= $_POST['no2'];
$no3= $_POST['no3'];
$no4= $_POST['no4'];

if ($_POST['no'] or $_POST['no1'] or $_POST['no2'] or $_POST['no3'] or $_POST['no4'])
{
$sql="select * from work where no= '$no' and no= '$no1' and no= '$no2' and no= '$no3' and no= '$no4'";
}
?>

正常來說 如果我 no、no1、no2、no3、no4 都有輸入查詢的值的話是可以搜尋出我要的資料~

但我想問的是,假設我只輸入一個 no1 的查詢值的話,其他 no、no2、no3、no4 都是空值沒輸入要查詢的值,會變成查詢不出我要的篩選資料,請問各位大大有沒有更好的寫法可以解決我的問題呢?
拜託了~~~

外獅佬 iT邦大師 1 級 ‧ 1 年前 檢舉

"select * from work where no= '$no' and no= '$no1' and no= '$no2' and no= '$no3' and no= '$no4'";


落寞
這真是太神奇了!傑克
一個欄位...如何可以同時等於5個不同的值?疑惑疑惑

SELECT * FROM work WHERE no='A' AND no='B' AND no='C' AND no='D' AND no='E'

這個....應該永遠都撈不到資料吧疑惑

union9999 iT邦新手 5 級 ‧ 1 年前 檢舉
wiselou 大大

不好意思 我打錯了!
"select * from work where no= '$no' and no1= '$no1' and no2= '$no2' and no3= '$no3' and no4= '$no4'";

這樣才對
外獅佬 iT邦大師 1 級 ‧ 1 年前 檢舉
所以你的問題根本不在MySql的查詢語法
問題在PHP的部份,要去驗證user端必須確實輸入了這5個欄位
6
jerry00218
iT邦研究生 2 級 ‧ 1 年前
最佳解答

蠻不簡潔的一個方法,你可以試試
但這方法沒對 POST 進來的資料作檢查,這個要注意

&lt;pre class="c" name="code">
$sql = 'SELECT * FROM work WHERE';
$flag = FALSE;
if(isset($_POST['no']){
    $flag = TRUE;
    $sql .= ' no = ' . $_POST['no'];   
}
if(isset($_POST['no1']){
	if($flag){
        $sql .= ' AND ';
    }
	$flag = TRUE;
    $sql .= ' no1 = ' . $_POST['no1'];   
}
if(isset($_POST['no2']){
	if($flag){
        $sql .= ' AND ';
    }
	$flag = TRUE;
    $sql .= ' no2 = ' . $_POST['no2'];   
}
if(isset($_POST['no3']){
	if($flag){
        $sql .= ' AND ';
    }
	$flag = TRUE;
    $sql .= ' no3 = ' . $_POST['no3'];   
}
if(isset($_POST['no4']){
	if($flag){
        $sql .= ' AND ';
    }
	$flag = TRUE;
    $sql .= ' no4 = ' . $_POST['no4'];   
}
union9999 iT邦新手 5 級 ‧ 1 年前 檢舉

jerry002182大大:

感謝您的參考寫法,後來發現少了一個 ) ,補上之後再搜尋時,好像沒有起作用,檢查了很久好像還是看不出拿裡有問題,小弟初學者請多諒解^^"

jerry00218 iT邦研究生 2 級 ‧ 1 年前 檢舉

我確實少了「)」,修正如下

&lt;pre class="c" name="code">
$sql = 'SELECT * FROM work WHERE';
$flag = FALSE;
if(isset($_POST['no'])){
    $flag = TRUE;
    $sql .= ' no = ' . $_POST['no'];   
}
if(isset($_POST['no1'])){
	if($flag){
        $sql .= ' AND ';
    }
	$flag = TRUE;
    $sql .= ' no1 = ' . $_POST['no1'];   
}
if(isset($_POST['no2'])){
	if($flag){
        $sql .= ' AND ';
    }
	$flag = TRUE;
    $sql .= ' no2 = ' . $_POST['no2'];   
}
if(isset($_POST['no3'])){
	if($flag){
        $sql .= ' AND ';
    }
	$flag = TRUE;
    $sql .= ' no3 = ' . $_POST['no3'];   
}
if(isset($_POST['no4'])){
	if($flag){
        $sql .= ' AND ';
    }
	$flag = TRUE;
    $sql .= ' no4 = ' . $_POST['no4'];   
}
4
msnman
iT邦研究生 4 級 ‧ 1 年前

$sql="select * from work where no= '$no' and no= '$no1' and no= '$no2' and no= '$no3' and no= '$no4'";

這條用and表示五個條件都必須成立才能運作,因此你只要改成or,就會變成五個條件只要一個成立就可運作。

看更多先前的回應...收起先前的回應...
union9999 iT邦新手 5 級 ‧ 1 年前 檢舉

msnman大大:
是的 如果我改成 or 是可以滿足我的程式問題,不過變成查詢篩選出來的資料不會是我要的準確資料,所以還是必須使用 and 去篩選我要的資料,導致我的問題出現了,不知道還有沒有更好的方法。

msnman iT邦研究生 4 級 ‧ 1 年前 檢舉

請舉例列出輸出結果。

union9999 iT邦新手 5 級 ‧ 1 年前 檢舉

msnman大大:

列印出來就是沒有任何資料,因為有空值。

union9999 iT邦新手 5 級 ‧ 1 年前 檢舉

$sql="select * from work where no= '$no' and no1= '$no1' and no2= '$no2' and no3= '$no3' and no4= '$no4'";

舉例的題目打錯了!!^^"

msnman iT邦研究生 4 級 ‧ 1 年前 檢舉

$sql = 'SELECT * FROM work WHERE';
if($_POST['no']!=null){
$sql .= ' no = ' . $_POST['no'];
if($_POST['no1']!=null or $_POST['no2']!=null or $_POST['no3']!=null or $_POST['no4']!=null){
$sql .= ' AND ';
}
}
if($_POST['no1']!=null){
$sql .= ' no1= ' . $_POST['no1'];
if($_POST['no2']!=null or $_POST['no3']!=null or $_POST['no4']!=null){
$sql .= ' AND ';
}
}
if($_POST['no2']!=null){
$sql .= ' no2 = ' . $_POST['no2'];
if($_POST['no3']!=null or $_POST['no4']!=null){
$sql .= ' AND ';
}
}
if($_POST['no3']!=null){
$sql .= ' no3 = ' . $_POST['no3'];
if($_POST['no4']!=null){
$sql .= ' AND ';
}
}
if($_POST['no4']!=null){
$sql .= ' no4 = ' . $_POST['no4'];
}

10
wiseguy
iT邦超人 1 級 ‧ 1 年前

如果你的表單沒有其它不必要的值,那就這樣寫即可:

&lt;pre class="c" name="code">$sql = 'SELECT * FROM work WHERE';
foreach ($_POST as $k => $v){
	$sql .= " and $k='" . addslashes($v) . "'";
}

如果你的表單有其它不是用來搜尋的值,那就這樣寫:

&lt;pre class="c" name="code">$finds = array('no', 'no1', 'no2', 'no3', 'no4');
$sql = 'SELECT * FROM work WHERE';
foreach ($_POST as $k => $v){
	if (in_array($k, $finds))
		$sql .= " and $k='" . addslashes($v) . "'";
}

PS. 請一定要記住:POST 值要檢查!POST 值要檢查!POST 值要檢查!

看更多先前的回應...收起先前的回應...
union9999 iT邦新手 5 級 ‧ 1 年前 檢舉

wiseguy 大大:

我的搜尋欄位有很多~
如果是單一的搜尋可以寫得出來,也可以查詢得出來。
但是我不知道如何寫多個判斷得查詢,例如有9個欄位,使用者可能只輸入2個欄位來篩選。

謝謝大大回覆^^"

union9999 iT邦新手 5 級 ‧ 1 年前 檢舉

wiseguy iT邦超人 1 級 ‧ 1 年前 檢舉

那就再補個條件就好了啊!

&lt;pre class="c" name="code">$finds = array('no', 'no1', 'no2', 'no3', 'no4');  
$sql = 'SELECT * FROM work WHERE';  
foreach ($_POST as $k => $v){  
    if (in_array($k, $finds) && !empty($v))  
        $sql .= " and $k='" . addslashes($v) . "'";  
}
union9999 iT邦新手 5 級 ‧ 1 年前 檢舉

感謝wiseguy大大

讓我又學會了不少~

我要發表回答

立即登入回答