0

我第一次尝试搜索引擎:我有一个名为“global”的数据库和一个名为“mpl”的表,其中包含 11 列(名称:客户、部件号、描述、原产国和其他几个)零件的行。我的目标是使用下面的代码 - 为用户在搜索字段中输入的部件号显示描述和原产国。

形式:

<form action="search.php" method="post"> 
<input type="text" name="find" /><br /> 
<input type="submit" value="Search" /> </form>

和 PHP:

$host = "localhost"; 
$dbuser = "root"; 
$dbpass = " "; 
$db = "global"; 

$con = mysql_connect($host, $dbuser, $dbpass);
    if(!$con){ die(mysql_error());
    } 
$select = mysql_select_db($db, $con);
    if(!$select){ die(mysql_error()); 
    } 
$item = $_REQUEST['find'];  
$data = mysql_query("SELECT * FROM mpl WHERE 'Part No' ='".$item."'"); 
while($row = mysql_fetch_array($data)){ 
        echo $row['Description']. "<br>";
        echo $row['Country Of Origin']. "<br><p>"; 
 } 

 ?>

有人可以告诉我我在做什么错吗?一旦我在我的“查找”表格中输入任何内容 - 我没有得到任何结果。如果我使用 LIKE 而不是没有值的“=”运行搜索 - 它会显示一堆描述和原产国 - 这意味着我已正确连接到我的数据库。这让我发疯了..我觉得我以某种方式搞砸了 mysql_query() 部分 - 但我不知道是哪一部分。

4

6 回答 6

1

您使用了错误的字符来转义查询中的 Part No 列名。用反引号 (`) 转义它们应该没问题。

$data = mysql_query("SELECT * FROM mpl WHERE `Part No` ='".$item."'");

此外,您应该验证用户的查询以防止 SQL 注入。

于 2013-01-27T13:16:36.333 回答
0

如果你改变:

$item = $_REQUEST['find'];  

$item = $_POST['find'];  

还有一些函数,如 mysql_select_db() 已被弃用并将被删除。见: http:
//php.net/manual/en/function.mysql-select-db.php

于 2013-01-27T13:04:43.303 回答
0

试试换这个药水。

$item = $_REQUEST['find'];   $data = mysql_query("SELECT * FROM mpl WHERE 'Part No' ='".$item."'");

对此

$item = $_POST['find'];  
$data = mysql_query("SELECT * FROM mpl WHERE Part No ='$item'");
于 2013-01-27T13:07:38.230 回答
0

首先,我同意昆汀的观点;你应该使用像 PDO 或 Mysqli 这样的数据库 API。其次,看起来人们可以通过零件编号或描述来搜索零件。假设零件编号是数字,描述是字符串...检查输入类型并相应地运行查询。

$host = "localhost"; 
$dbuser = "root"; 
$dbpass = ""; 
$db = "global";

// Establish a database connection and select one.
// Try using one of the database API's.

// Then compose your sql by checking for the type of input from the form.
// Since your request method is a POST, then just look in the `_POST` superglobal.
$item = $_POST['find'];

if( is_numeric($item) ){
   $sql = "SELECT * FROM mpl WHERE 'Part No' = {$item}";
}else{
   $sql = "SELECT * FROM mpl WHERE 'Description' LIKE '%{$item}%'";
}

// Then perform the query.
于 2013-01-27T13:31:05.453 回答
0

在您的请求中执行类似的操作以删除任何可能的空格并将选择字符串规范化为大写。

$item = strtoupper(trim($_REQUEST['find']));  

并在您的 SQL 中执行此操作:也进行规范化。

$data = mysql_query("SELECT * FROM mpl WHERE UPPER(TRIM('Part No')) ='".$item."'"); 

您的 where 子句基本上没有完全匹配

于 2013-01-27T13:11:35.523 回答
0

这里的很多人已经指出了您的代码中可能的和实际的错误,但这是综合解决方案。首先,我将您的代码转换为mysqli,这是连接到 mySQL 数据库的正确方法。您的连接方式已过时,不推荐使用。其次,我添加了一些代码来停止 sql 注入。第三,我'Part No'在您的查询中更改为“零件编号”(忽略第二个反勾号)。

<?php

$mysqli = new mysqli('localhost', 'root', DB_PASSWORD, 'global');

/* check connection */
if ($mysqli->connect_error)
  die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);

/* escape string from sql injection */
$item = $mysqli->real_escape_string($_POST['find']);

/* query database */
$result = $mysqli->query("SELECT * FROM `mpl` WHERE `Part No` = '".$item."'");
while ($col = $result->fetch_array(MYSQLI_ASSOC))
  echo '<p>' . $col['Description'] . '<br />' . $col['Country Of Origin'] . '</p>';
$result->close();

/* don't forget to close the connection */
$mysqli->close();

?>
于 2013-01-27T13:28:13.330 回答