2015-11-20 100 views
1

我正在使用簡單的表單來執行數據庫查詢。數據庫通過我在代碼中包含的密碼進行訪問。我不知道爲什麼我繼續打字符串轉義錯誤和未定義的變量$ query = htmlspecialchars($ query);拒絕訪問用戶'root'@'localhost'(使用密碼:否)

<?php 
$servername = "localhost"; 
$username = "xxx"; 
$password = "xxx"; 
$dbname = "xxx"; 

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

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Search</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <link rel="stylesheet" type="text/css" href="style.css"/> 
</head> 
<body> 
    <form action="Search2.php" method="POST"> 
     <input type="text" name="query" /> 
     <input type="submit" value="Search" /> 
    </form> 

<?php 

if (isset($_POST['query'])) 
$query = $_POST['query']; 

if (!empty($query)) 

    $query = $_POST['query']; 
    // gets value sent over search form 


     $query = htmlspecialchars($query); 
     // changes characters used in html to their equivalents, for example: < to &gt; 

     $query = mysql_real_escape_string($query); 
     // makes sure nobody uses SQL injection 

     $raw_results = mysql_query("SELECT LastName, FirstName FROM Staff 
      WHERE (`LastName` LIKE '%".$query."%') OR (`FirstName` LIKE '%".$query."%')") or die(mysql_error()); 


     if(mysql_num_rows($raw_results) > 0){ // if one or more rows are returned do following 

      while($results = mysql_fetch_array($raw_results)){ 
      // $results = mysql_fetch_array($raw_results) puts data from database into array, while it's valid it does the loop 

       echo "<p><h3>".$results['LastName']."</h3>".$results['FirstName']."</p>"; 
       // posts results gotten from database(title and text) you can also show id ($results['id']) 
      } 

     } 
     else{ // if there is no matching rows do following 
      echo "No results"; 
     } 


    ?> 



</body> 
</html> 
+0

您縮進了代碼,但沒有在{if語句後面加上{}。 {需要在if語句中有多行代碼。 – kainaw

+0

你在混合'mysql_ *'和'mysqli_ *'函數。這是行不通的。 –

回答

2

這裏的問題是,你調用一個mysqli對象使用您的憑據,但是,以後你嘗試用mysql_程序的方法來執行。你沒有連接。您需要堅持使用mysqli對象。此外,您應該使用預處理語句來處理SQL查詢中的用戶輸入。

刪除這些,我們不需要準備語句做消毒:

//BYE! 
$query = htmlspecialchars($query); 
    // changes characters used in html to their equivalents, for example: < to &gt; 

$query = mysql_real_escape_string($query); 
    // makes sure nobody uses SQL injection 

現在讓我們使用的mysqli對象和OOP編制方法。但是,首先我們需要構造類似的語句,因爲我們的查詢變量未執行,因此不能將%?%直接連接到prepared()語句中。

$query = '%'.$query.'%'; 

$stmt = $mysqli->prepare("SELECT LastName, FirstName FROM Staff 
     WHERE LastName LIKE ? OR FirstName LIKE ?"); 

現在我們可以綁定的參數我們$stmt對象。

$stmt->bind_param('ss', $query, $query); 

讓我們現在執行它並獲取我們的數據。

$result = $stmt->execute(); 

然後,我們可以循環:

while ($row = $result->fetch_assoc()) { 
    echo "<p><h3>".$result['LastName']."</h3>".$result['FirstName']."</p>"; 
} 

編輯

你也不必用反引號逃脫列名,因爲:

  • 他們不沒有-的名字
  • 他們不是在MySQL中保留的特殊字。
+0

我想我明白你要去哪裏了。我嘗試運行它,但我得到了一個語法錯誤,意外的T_STRING在這裏 - $ stmt-> bind_param('ss',$ query,$ query); – Tony

+0

@Tony請再次檢查,在我的回覆中,我省略了'';''$ stmt = $ mysqli-> prepare('line。My apologies。 – Ohgodwhy

+0

我看着它,看到它,並認爲你知道一些關於結構的東西,所以我沒有這麼忽略它。我做了更改,但仍然不斷收到語法錯誤的其他行語法錯誤,意外的T_STRING在這裏 - $ stmt-> bind_param('ss',$ query,$ query); 'ss'從哪裏來? – Tony

0

確保你的PHP版本低於7.0如下陳述:

http://php.net/manual/en/function.mysql-real-escape-string.php

警告 該擴展是PHP 5.5.0過時,它是在PHP 7.0.0中刪除。相反,應該使用MySQLi或PDO_MySQL擴展。另請參閱MySQL:選擇API指南和相關FAQ以獲取更多信息。此函數的替代方法包括: mysqli_real_escape_string() PDO :: quote()

相關問題