0

私は検索エンジンを初めて試しています。「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を使用して検索を実行すると、一連の説明と原産国が表示されます。これは、DBに正しく接続したことを意味します。これは私を狂わせています..私はmysql_query()の部分をどういうわけか台無しにしたように感じます-しかし、私はどの部分を理解することができません。

4

6 に答える 6

1

クエリで部品番号列名をエスケープするために間違った文字を使用しています。バックティック( `)でそれらをエスケープすると、問題ないはずです。

$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

リクエストでこのようなことを行って、可能な空白を削除し、選択した文字列を大文字に正規化します。

$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'クエリで「パーツ番号」(2番目のバックティックは無視)に変更しました。

<?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 に答える
0

まず、Quentinに同意します。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 に答える