-1

私の PHP ドキュメントでは、次のような SQL クエリを取得しました。

if(isset($_GET['id']))
{
    $id = $_GET['id'];
    $q = "SELECT * FROM `objekt_t` WHERE `id`='" . $id . "'";
    $row = mysqli_query($con, $q) or die(mysqli_error($con));
    while($r = mysqli_fetch_assoc($row))
    {
        $objekt = $r;
    }
}

これは SQL インジェクションなどに関して非常に危険な行為であることを認識しているため、バインドされたパラメーターを使用して、準備された SQL クエリを調べてきました。bobby-tables.comを見ると、次のサンプル クエリが表示されます。

$stmt = $db->prepare('update people set name = ? where id = ?');
$stmt->bind_param('si',$name,$id);
$stmt->execute();

バインドされたパラメーターを使用して、現在のクエリをより安全なクエリに変更する方法がわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

1

SQL インジェクションが不可能になるように、準備済みステートメントは生データをクエリに送信します。real_escape_Stringforやその他の書式設定関数をエスケープする必要はありません。

例:

$db = new mysqli ("host","user","password","database");
$statement = $db->prepare("SELECT test FROM test WHERE Username=?");
$statement->bind_param('s',$_POST['Username']);
$statement->execute();
$statement->bind_result($resultCol);
$statement->fetch();
$statement->close();

データは生のまま送信されるため、基本的に $_POST データをクエリに直接バインドしています。クエリは通常どおり実行されます。


手順と OOP スタイルに関しては、好みの問題です。個人的には、他のオプションよりも読みやすい OOP スタイルを好みます。

数字の操作:

$ID= 5;
$db = new mysqli ("host","user","password","database");
$statement = $db->prepare("SELECT test FROM test WHERE ID=?");
$statement->bind_param('i',$ID);
$statement->execute();
$statement->bind_result($resultCol);
$statement->fetch();
$statement->close();

または、ステートメント内で直接正確な値を操作できます。

$db = new mysqli ("host","user","password","database");
$statement = $db->prepare("SELECT test FROM test WHERE ID='5'");
$statement->execute();
$statement->bind_result($resultCol);
$statement->fetch();
$statement->close();
于 2013-04-14T15:42:37.300 に答える
1

まったく同じように

$mysqli = new mysqli("localhost", "my_user", "my_password", "db");

if(isset($_GET['id']))
{
    $id = $_GET['id'];
    $q = "SELECT some_field FROM `objekt_t` WHERE `id`= ?";

    if ($stmt = $mysqli->prepare($q)) {    
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $stmt->bind_result($result);
        $stmt->fetch();
    }
}

$result 変数には、クエリの結果が含まれます。

于 2013-04-14T15:43:24.100 に答える
0

次のように実行できます。

$stmt = $mysqli->prepare('SELECT * FROM objekt_t WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();

$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    // $row is an associative array
}
于 2013-04-14T15:49:42.880 に答える