2

このコードは私にとってはうまくいきません。私のlist.phpはすべてのメンバーを示しています。行の編集をクリックすると、「update.php?id=#」を示す update.php に移動し、常に正しい番号を表示するための小さなコードがあります。しかし、個人情報を表示できません。これが私が持っているものです

<?
    $id = $_GET['id'];
     echo "<print>" .$id."</print>";
    mysql_query("SET NAMES utf8"); 
    mysql_query("SET CHARACTER_SET utf8");
    header('Content-type: text/html;charset=utf-8');   
    $order = 'SELECT * FROM `person` WHERE `PersonID` = $id';  
    $result = mysql_query($order);
?>

私のlist.phpにあるように、テーブルに人の情報を表示する必要がありますが、何も表示されませんか? 'PersonID' = 1234たとえば、置き換えると、情報が得られます。コードが使用されておらず$id、後に配置されているのはなぜ'PersonID' = .ですか?

4

3 に答える 3

7

$_GET['id'] の内容を直接データベースに渡しています1'。せいぜいそれはクエリを壊します。最悪の場合、誰かがあなたのデータベースに厄介なことをする可能性があります。少なくとも、データをサニタイズする必要があります。

mysql_real_escape_stringwill let you escape a string so you can do this; if PersonID` は int です。intvalを使用して文字列の整数値を取得し、無効な文字がそのように渡されるのを防ぐこともできます。

実際に発生している問題は、PHP が単一引用符で囲まれた文字列を文字列リテラルとして扱うためです。置換が必要な変数があるかどうかを確認するためにそれを解析しません。文字列として扱っ$idています。やろうとしていることを行うには、二重引用符を使用する必要があります。

$id = intval($_GET['id']);
$order = "SELECT * FROM `person` WHERE `PersonID` = $id";

mysql_* 関数は非推奨であるため、これらの関数からの移行も検討する必要があります。これを回避するには、代わりに mysqli_* または PDO に移行することを検討してください。どちらも、準備されたステートメントを使用して変数をバインドすることにより、より安全なコードを作成するのに役立ちます。

于 2013-07-23T17:49:13.190 に答える
2

単一引用符で囲まれた文字列内の変数は補間されません。二重引用符または文字列連結を使用します。

$id = mysql_real_escape_string($id);
$order = "SELECT * FROM `person` WHERE `PersonID` = $id"; 

または:

$order = 'SELECT * FROM `person` WHERE `PersonID` = ' . mysql_real_escape_string($id);

ただし、他の多くの人が言及しているように、このクエリは SQL インジェクションの傾向があります。文字列補間または文字列連結を使用するほとんどすべてのクエリは、変数がユーザー入力値であるため、SQL インジェクションの傾向があります。パラメータ化されたクエリは次のようになります。

$order = 'SELECT * FROM `person` WHERE `PersonID` = ?';

別の方法として、PDO を使用している場合は、次のようにパラメーターに名前を付けることができます。

$order = 'SELECT * FROM `person` WHERE `PersonID` = :id;';

次に、適切なメソッドを使用してパラメーターをクエリにバインドし、それを実行します。PDO を使用すると、次のようになります (もちろん、 のデータベース接続を作成するには、これより前にコードが必要です$db):

$statement = $db->prepare($order);
$statement->bindValue(':id', $id, PDO::PARAM_INT);
$statement->execute();

これは、パラメーター化されたクエリを使用するためのほんの始まりにすぎません。PDO の詳細については、PHP マニュアルを参照してください。

于 2013-07-23T17:46:39.263 に答える
-1

試す

$order = "SELECT * FROM `person` WHERE `PersonID` = '$id'";

自分のプロジェクトでこれを行う必要がありましたが、他に何も機能しませんでした。ID を '' で囲み、php 文字列を " で開始および終了するだけです。

于 2013-07-23T17:46:58.650 に答える