2015-11-20 106 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()

相关问题