3

さて、私は調査を行いましたが、これを理解できないようです。簡単に言えば、私は次のようなものを使用しています:

ところで、「(WebsiteInfo)」は私のウェブサイト/データベース情報を感知するためのものです。

$SQL = new PDO('mysql:dbname=(WebsiteInfo);host=(WebsiteInfo);charset=utf8', '(WebsiteInfo)', '(WebsiteInfo)');

$SQL -> setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$SQL -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

さて、それは現在、データベースの接続を開始するだけです。ところで、これはほとんどがこのWebサイトで見つけたコピー/貼り付けコードであり、MySQLインジェクションを防ぐためのものです。実際にはこのリンクからPHPでSQLインジェクションを防ぐにはどうすればよいですか? . 何か問題がある場合は、アドバイスやヒントを気にしません。データベースを使い始めたのはおそらく 1 週間前ではないので、それが理にかなっている限り、すべてが新しいものです。今これがあります:

$Exicu = $SQL -> prepare("SELECT `tags` FROM `users` WHERE `user_id` = :a ") -> execute(array( ':a' => 16));

$Exicuクエリから結果を取得しようとしていたためです (正しいと言った場合)。また、16 はユーザー ID ですが、これは頻繁に変更されるため、prepare ステートメントで 16 を使用するだけではありません。私は多くのことを試しましたが、どれもうまくいきませんでした。動作しないか、PHP がクラッシュしました。

とにかく、私がすでに試したこと$Exicu$Exicu->rowCount()、 、 、 、 、 、 、、、およびを含むwhile ループ$Exicu->bindParamです。はい、私は知っています、それはかなりずさんに見えます。$row = $Exicu->fetch()$SQL->query($Exicu)->fetchAll();foreach($Exicu->fetch(PDO::FETCH_ASSOC) as $row)$Exicu->get_result()echo PDO::query($Exicu);echo mysql_result($Exicu)echo $Exicu

しかし、これらのどれもtags、特定のユーザーのデータベースから私に表示するだけではうまくいかなかったようです。だから、それは私が助けを必要としているものです。このようなものを使用しても問題echo mysql_result( mysql_query("SELECT (etc,etc)") )はありませんが、MySQL インジェクションからの保護はありません。

4

2 に答える 2

5

私は次のように PDO クエリを実行します。

$user_id = 16;    

$query = $SQL->prepare('SELECT tags FROM users WHERE user_id = :uid');
$query->bindValue(':uid', $user_id, PDO::PARAM_INT);
$query->execute();

while ($row = $query->fetch(PDO::FETCH_ASSOC))
{
    echo $row['tags'];
}

これにより、データベースからデータが選択され、値が安全にバインドされ、結果がエコーされます。

ループは、クエリから返されたすべての結果を反復処理するために必要です。whileループ部分をスキップして、ステートメントのように変数を作成$rowし、結果の配列として使用できます。

于 2013-02-13T21:57:29.300 に答える
0

ユーザー定義関数というものがあります。

このサイトで誰もそれらを使用していないのはなぜだろうか。
何らかの理由で、クリーンで簡潔な関数呼び出しの代わりに、チェーンされたメソッドの 1 マイルの長い行を作成する準備ができています。

$user_id = 16;    
$tags = getone('SELECT tags FROM users WHERE user_id = ?',array($user_id));

このような関数を作成する方法はたくさんあります。迅速で汚いもの

function getone($sql, $data) {
    global $SQL;
    $stmt = $SQL->prepare($sql);
    $stmt->execute($data);
    return reset($stmt->fetch());
}

もちろん、関数のセットを作成してクラスに入れる方が良いでしょう

于 2013-02-14T07:13:31.657 に答える