我第一次尝试使用搜索引擎: 我有一个名为“global”的数据库和一个名为“mpl”的表,其中包含11列(命名:Customer,Part No,Descripton,Country of Origin和其他几个),其中包含多行部分。 我的目标是使用下面的代码 - 是为用户输入搜索字段的部件号显示描述和原产国。
形式:
<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>";
}
?>
有人能告诉我我做错了什么吗?一旦我输入任何形式'find' - 我得不到任何结果。如果我使用LIKE而不是“=”运行搜索而没有值 - 它会显示一堆描述和原产国 - 这意味着我已正确连接到我的数据库。这让我疯了。我觉得我已经搞砸了mysql_query()部分 - 但是我无法弄清楚哪个部分。
答案 0 :(得分:1)
您使用错误的字符来转义查询中的“部件号”列名称。用反引号(`)逃脱它们,应该没问题。
$data = mysql_query("SELECT * FROM mpl WHERE `Part No` ='".$item."'");
此外,您应该验证用户的查询以防止SQL注入。
答案 1 :(得分:0)
如果你改变了怎么办?
$item = $_REQUEST['find'];
到
$item = $_POST['find'];
还有一些函数如mysql_select_db()已被弃用并将被删除。请参阅:
http://php.net/manual/en/function.mysql-select-db.php
答案 2 :(得分: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'");
答案 3 :(得分:0)
在您的请求中执行类似的操作,删除任何可能的空格,并将其标准化为大写字母以供选择字符串使用。
$item = strtoupper(trim($_REQUEST['find']));
在SQL中执行此操作:也要进行规范化。
$data = mysql_query("SELECT * FROM mpl WHERE UPPER(TRIM('Part No')) ='".$item."'");
你基本上没有得到你的where子句
的完全匹配答案 4 :(得分:0)
这里的很多人已经在您的代码中指出了可能的和实际的错误,但这是组合的解决方案。首先,我将您的代码转换为mysqli,这是连接到mySQL数据库的正确方法。您的连接方式已过时,不建议使用。其次我添加了一些代码来阻止sql注入。第三,我在你的查询中将'Part No'
更改为“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();
?>
答案 5 :(得分: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.