2015-02-07 140 views
3

我是一個相對的新手,當涉及到PHP和做了一些搜索後,我似乎無法找到我的問題的答案。PHP搜索然後插入

我所擁有的是非常基本的,兩個表'人'和'案例'。我可以插入和搜索一個人(雖然我花了一些時間才能使它工作!)。現在,當涉及到一個'案例'時,我需要首先搜索一個人,我希望搜索結果仍然填寫在表單中,然後用戶將其餘的案例信息添加到表單中,然後提交。我試過將兩個代碼結合在一起,但我仍然沒有成功。

即使我能找到一種輸出方式來保持填充形式,這對我來說是一大進步。我已將輸出結果保留爲打印狀態,以便搜索結果顯示在頁面上。任何幫助將不勝感激。當前的搜索和插入代碼如下:

<?php 

    include 'connection.php'; 
    $output =''; 
    //collect 

    if (isset($_POST['search'])) { 
     $searchq = $_POST['search']; 
     $searchq = preg_replace("#[^0-9a-z]#i","",$searchq); 

     $query = mysql_query("SELECT * FROM person WHERE forename LIKE '%$searchq%' OR surname LIKE '%$searchq%'") or die("Could not search"); 
     $count = mysql_num_rows($query); 
     if ($count == 0) { 
      $output = 'There was no search results'; 
     }else{ 
      while($row = mysql_fetch_array($query)) { 
       $firstname = $row['forename']; 
       $lastname = $row['surname']; 

       $output .= '<div>'.$firstname.' '.$lastname.'</div>'; 
     } 
    } 
    } 
    ?> 

    <form action="basicsearch.php" method="post"> 
     <input type="text" name="search" placeholder="Search for Persons..." onkeydown="searchq()1" /> 
     <input type="submit" value=">>"/> 

    </form> 

    <?php print("$output");?> 



<?php 
$forename = $surname = $dateofbirth = $postcode = $addresslineone = $addresslinetwo = $towncity = $contactnumber=""; 
$forenameErr = $surnameErr = $dateofbirthErr = $postcodeErr = $addresslineoneErr = $addresslinetwoErr = $towncityErr = $contactnumberErr = ""; 

if ($_SERVER['REQUEST_METHOD']== "POST") { 
    $valid = true; 

    if (empty($_POST["forename"])) { 
     $forenameErr = "*First name is required"; 
     $valid = false; 
    } 
    else { 
     $forename = test_input($_POST["forename"]); 
    } 

    if (empty($_POST["surname"])) { 
     $surnameErr = "*Last name is required"; 
     $valid = false; 
    } 
    else { 
     $surname = test_input($_POST["surname"]); 
    } 

    //only testing forename/surname at the moment 

    if($valid){ 
     include 'datasubmitted.php'; 
     exit; 
    } 
} 

function test_input($data) { 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
} 
?> 

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post"> 
    <div class="label">*First Name: 
     <div class="txtbox"> 
      <input name="forename" type="text" id="txt" placeholder="Enter Your First Name." value="<?php echo $surname; ?>"/> 
      <span class="error"><p></p><?php echo $forenameErr; ?></span> 
     </div> 
    </div> 
    <div class="label">Last Name: 
     <div class="txtbox"> 
      <input name="surname" type="text" id="txt" placeholder="Enter Your Last Name." value="<?php echo $surname; ?>"/> 
      <span class="error"><p></p><?php echo $surnameErr; ?> 
     </div> 
    </div> 
<input type="submit" value="Submit" name="Submit" /> 
</form> 

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post"> 
    <div class="label">*First Name: 
     <div class="txtbox"> 
      <input name="forename" type="text" id="txt" placeholder="Enter Your First Name." value="<?php echo $surname; ?>"/> 
      <span class="error"><p></p><?php echo $forenameErr; ?></span> 
     </div> 
    </div> 
    <div class="label">Last Name: 
     <div class="txtbox"> 
      <input name="surname" type="text" id="txt" placeholder="Enter Your Last Name." value="<?php echo $surname; ?>"/> 
      <span class="error"><p></p><?php echo $surnameErr; ?> 
     </div> 
    </div> 
<input type="submit" value="Submit" name="Submit" /> 
</form> 

一切順利, 克里斯

+0

嗨,歡迎來到Stack Overflow。感謝發佈代碼,這是一個很大的幫助。然而,從你的問題來看,這段代碼現在在做什麼並不是很清楚。你會嘗試澄清你正在觀察的當前行爲以及期望的行爲嗎? – paulmelnikow 2015-02-07 23:30:49

+0

謝謝你的回覆。當然,我有兩個單獨的代碼,一個用於插入,一個用於搜索。我希望它能夠搜索客戶端所需的功能,一旦搜索完成,它將填充其他文本框。因此,例如尋找姓氏會填充其他框,如姓氏,郵編,出生日期等,我不確定我會如何做到這一點。然後,我會將搜索結果的結果與用戶放入案例字段中的附加信息結合起來。 – Chris32 2015-02-08 03:11:52

+0

@noa因此,首先您有一個存儲客戶信息的客戶表以及一個存儲案例信息的案例表。提交案例時,您必須先查找客戶,然後輸入案例詳細信息並保存。我目前有一個回聲列表,列出所有從搜索返回的標準列表,而不是我希望通過拉入表單的文本框,所以文本框姓將填充用戶姓氏,出生日期與搜索結果出生日期等。我希望這是有道理的。 – Chris32 2015-02-08 18:38:48

回答

0

首先,你的SQL代碼可能仍然容易受到SQL注入,儘管你的preg_replace的應用程序()。對使用PHP filter_input函數清理的輸入使用參數化查詢更好。 (這比手工製造的輸入消毒劑更有可能失敗。)

我看不到您的INSERT語句。您正在使用MySQL,因此您可能首先考慮執行INSERT IGNORE,然後再執行SELECT。

但是,即使這個建議也沒有刮擦比第一次出現更復雜的主題的表面。如果你有兩個同名的客戶(名字相同,但是不同的人),你會怎麼做?你將如何處理潛在的名稱錯誤拼寫,以及由此產生的重複記錄?每個人能有多少個案子?這些都是系統問題,也是用戶界面人機工程學問題。只有認真的用戶界面設計和系統設計纔能有效克服這些問題! 如果您正在處理可能有數千條記錄的數據庫,則需要仔細考慮這些問題。如果你「只」與數百人打交道;那麼這可能不成問題!

請告訴我們更多...

+0

謝謝你的回覆,我沒有考慮過很多很好的問題。我正在考慮讓用戶通過姓和ID進行搜索,或者將結果打印到表中,然後用戶可以從生成的表中修改用戶。該系統只處理少量的客戶。客戶可以有很多情況。我認爲我需要更多地研究這個問題,但如果可能的話,我願意接受任何建議,仍然非常接近SQL/PHP。再次感謝,克里斯。 – Chris32 2015-02-09 12:21:18

+1

如果您的系統「僅」旨在處理少量客戶端;那麼從超鏈接的列表/表格中選擇該人員可能是合適的(可以按名字或姓氏過濾/排序);然後有一個單獨的人物細節頁面;您可以在其中顯示個人詳細信息的編輯表格,案例列表/表格以及用於輸入任何新案例的詳細信息的表格。根據你的PHP代碼,我認爲這種類型的解決方案應該是你一定可能的! – 2015-02-09 12:33:02

+0

是的,它是一個非常小的系統。你的建議似乎是最合乎邏輯的方法。因此,請在帶有姓氏過濾器的頁面上列出整個客戶表格,並在每個表示「選擇」的客戶旁邊列出一個鏈接。然後,這將打開一個不同的頁面,其中包含一個添加案例的表單,在案例的頂部會顯示'客戶ID',該字段將來自使用前一個屏幕中的'選擇'字段。然後,用戶將填寫表格的其餘部分,並提供案例詳細信息。用客戶端ID將客戶端連接到案例。我是太天真還是雄心勃勃? – Chris32 2015-02-09 14:02:57

相關問題