2015-07-21 108 views
1

我正在嘗試使用jQuery,Ajax和PHP爲MySQL表創建搜索引擎。我有一個數據庫在我的外部服務器上以獲取數據。這是MySQL數據庫表的圖片。 enter image description here
我對搜索引擎這兩個腳本:使用jQuery,Ajax和PHP不能正常工作搜索到MySQL表

的index.html

<!Doctype html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <script src="//code.jquery.com/jquery-1.11.3.min.js"></script> 
    </head> 
    <body> 
     <input id="searchdb"/> 
     <div id="resultdb"></div> 

     <script type="text/javascript"> 
      $(document).ready(function() { 
       $('#searchdb').change(function() { 
        $.ajax({ 
         type: 'GET', 
         url: 'getdb.php', 
         data: 'ip=' + $('#searchdb').val(), 
         success: function(msg) { 
          $('#resultdb').html(msg); 
         } 
        }); 
       }); 
      }); 
     </script> 
    </body> 
</html> 

getdb.php

<?php 
if ($_GET['insert']) : 
    $insert = preg_replace('#[^0-9]#', '', $_GET['insert']); 
    $servername = "localhost"; 
    $username = "username"; 
    $password = "password"; 
    $dbname = "mydb"; 

    // Create connection 
    $conn = new mysqli($servername, $username, $password, $dbname); 
    // Check connection 
    if ($conn->connect_error) { 
     die("Connection failed: " . $conn->connect_error); 
    } 


    $sql = "SELECT id, name FROM test WHERE id='.$insert.'"; 
    $result = $conn->query($sql); 

    if ($result->num_rows > 0) { 
    // output data of each row 
     $row = $result->fetch_assoc() 
      echo $row["name"]; 
    } 
endif; 
?> 

我想是輸入ID,按回車鍵取回名稱或「0結果」。我寫的代碼似乎有些問題。你可以幫我嗎?提前致謝。

+1

您正在使用'ip'創建查詢字符串,但您的PHP代碼查找'insert'。你的PHP代碼中的'$ row = $ result-> fetch_assoc()'後面還缺少一個分號。可能還有其他錯誤。 – 2015-07-21 02:33:49

+0

可能會拉伸一些東西,稱之爲「搜索引擎」? – charlietfl

+0

[**如何調試小程序** http://ericlippert.com/2014/03/05/how-to-debug-small-programs/](http://ericlippert.com/2014/03/05/how-to-debug-small-programs /) – spencer7593

回答

1

您的SQL文本字符串中的句點字符被解釋爲文字點字符,而不是PHP連接。

例如

 $sql = "SELECT id, name FROM test WHERE id='.$insert.'"; 
    echo "SQL=" . $sql; 

應該返回:

 SQL=SELECT id, name FROM test WHERE id='.123.' 

這將是很容易解決。但爲什麼首先將該值作爲SQL文本的一部分。

使用預處理語句和綁定佔位符真的是不那麼難

使用靜態字符串作爲SQL語句,使用問號作爲綁定佔位符,並調用mysqli_stmt_bind_param函數。並檢查準備和執行錯誤的呼叫。 (如果發生錯誤,則返回FALSE。)並且不需要調用num_rows。只要做一個提取。如果它返回一行,你就有了一行。如果它返回FALSE,則不會返回一行。

事情是這樣的:

$sql = "SELECT id, name FROM test WHERE id = ? "; 
    if ($stmt = $conn->prepare($sql)) { 
     $stmt->bind_param("i",$insert); 
     if ($stmt->execute()) { 
      if ($row = $stmt->fetch_assoc()) { 
       echo $row['name']; 
      } else { 
       echo "0 results"; 
      } 
     } else { 
      // handle error 
      die $conn->error; 
     } 
    } else { 
     // handle error 
     die $conn->error; 
    } 

你可以不同的方式處理錯誤情況,根據您的要求。

+0

** NOTE **:在我的答案中使用'die'顯示的示例語法在沒有parens的情況下將不起作用。 (對不起,我的Perl正在顯示。)但是你可能不想使用'die'。如果你想把錯誤字符串返回給調用者,你可以使用'echo'。 – spencer7593