2017-01-26 76 views
2

如何搜索名稱或類似關鍵字的內容,並期望獲得許多結果?在PHP中搜索名字

一樣,當你搜索馬克
你希望有這樣的:
馬克·扎克伯格
馬克哈米爾
馬克菲施巴赫
...

但是當我做查詢時,它只顯示一個給我。

我試過使用許多不同的SQL子句和其他東西,但仍然給我一個這樣的結果。順便說一句,我使用PDO作爲我的數據庫處理程序。

這是我的代碼:

<?php 
require_once '../../assets/conn.db.php'; 
require_once '../../assets/init.php'; 
require_once '../../assets/main.func.php'; 

if($_POST){ 
    $namesearch = $_POST['name']; 

    $sql = "SELECT * FROM `student_info` WHERE username LIKE ? OR username LIKE ?"; 
    $checkstmt = $conn->prepare($sql); 
    $checkstmt->execute(array("%{$namesearch}%","%{$namesearch}%")); 
    $result = $checkstmt->fetch(PDO::FETCH_ASSOC); 

    if($result){ 
    echo " 
    <table border='1' class='text-align: center'> 
     <tr> 
     <th>Name</th> 
     <th>Phone</th> 
     <th>Address</th> 
     <th>Username</th> 
     <th>Action</th> 
     </tr> 
     <tr> 
     <td>{$result['name']}</td> 
     <td>{$result['phone']}</td> 
     <td>{$result['address']}</td> 
     <td>{$result['username']}</td> 
     <td><a href='grades.php?user=".$result['StudentID']."'>+</a> Add Grades</td> 
     </tr> 
    </table> <br> 
    "; 
    } 
} 

?> 

<form method="post"> 
    <input type="text" name="name" placeholder="Search for a student"> 
    <input type="submit" value="Search!"> 
</form> 
+0

您只能獲取一個(「下一個」)行。你需要循環並把它們全部取出。像'while($ result = $ checkstmt-> fetch(...){...' – Jeff

回答

2

查詢返回你所需要的所有結果,但你只取一個數據。 K. O.滾動先生給你的如何遍歷結果,讓應用,爲您的具體問題的總體思路:

require_once '../../assets/conn.db.php'; 
require_once '../../assets/init.php'; 
require_once '../../assets/main.func.php'; 

if($_POST){ 
    $namesearch = $_POST['name']; 

    $sql = "SELECT * FROM `student_info` WHERE username LIKE ? OR username LIKE ?"; 
    $checkstmt = $conn->prepare($sql); 
    $checkstmt->execute(array("%{$namesearch}%","%{$namesearch}%")); 
    $result = $checkstmt->fetch(PDO::FETCH_ASSOC); 

    echo " 
    <table border='1' class='text-align: center'> 
     <tr> 
     <th>Name</th> 
     <th>Phone</th> 
     <th>Address</th> 
     <th>Username</th> 
     <th>Action</th> 
     </tr>"; 
    while($data = $checkstmt->fetch(PDO::FETCH_ASSOC)){ 
    echo " 
     <tr> 
     <td>{$result['name']}</td> 
     <td>{$result['phone']}</td> 
     <td>{$result['address']}</td> 
     <td>{$result['username']}</td> 
     <td><a href='grades.php?user=".$data['StudentID']."'>+</a> Add Grades</td> 
     </tr> 
    "; 
    } 
    echo "</table> <br>"; 
} 

的代碼是未經測試。在每次迭代的while中,用當前元素初始化$data並對其進行邏輯評估。如果沒有更多的元素,那麼它將是假的,循環將會退出。否則,它將獲得該項目並編寫tr

進一步改進:

$sql = "SELECT * FROM `student_info` WHERE username LIKE ? OR username LIKE ?"; 
    $checkstmt = $conn->prepare($sql); 
    $checkstmt->execute(array("%{$namesearch}%","%{$namesearch}%")); 

這裏要注意檢查同樣的事情兩次,這不是很理想。改進:

$sql = "SELECT * FROM `student_info` WHERE username LIKE ?"; 
    $checkstmt = $conn->prepare($sql); 
    $checkstmt->execute(array("%{$namesearch}%")); 

此外,在select中使用列列表而不是*是明智的。

+0

'foreach'可以替代一段時間,並且是否存在與foreach相比的基準或性能差異'while while循環? – astronomicalXoom

+1

爲了能夠使用一個foreach,你需要有一個迭代集,在這種情況下,你沒有這樣的設置,但是你可以通過使用fetchAll來獲得一個,如果你這樣做,你將會能夠迭代結果,請參閱:http://php.net/manual/ro/pdostatement.fetchall.php –

+1

@astronomicalXoom主要是差異來自週期內完成的差異。在我們的情況下,foreach和while將同樣的事情基本上,因此如果有的話,差異是微不足道的。 –

4

SQL查詢語句是正確的,輸出必須遍歷$結果結果中的所有元素。

例子:

while($data = $result->fetch_array()) 
{ 
    echo $result["name"]; 
}