0
<?php
/**
 * Simple example of extending the SQLite3 class and changing the __construct
 * parameters, then using the open method to initialize the DB.
 */
class MyDB extends SQLite3
{
    function __construct()
    {
        $this->open('wifin.db');
    }
}
$db = new MyDB();

$mac = 'test';
$ssid = $_POST['ssid'];
$lat = $_POST['lat'];
$lon = $_POST['lon'];

$db->exec("INSERT INTO wifinTb (mac,ssid,lat,lon) VALUES ($mac,$ssid,$lat,$lon)");

$result = $db->query('SELECT * FROM wifinTb WHERE mac=$mac');

var_dump($result->fetchArray());

?>

php5 で変数を使用する方法がわかりません。$mac は文字列である必要があります。直接使用するmac=$macと bool(false) が返されます。これは見つからないことを意味しますが、使用するmac='test'と結果が得られます。

4

3 に答える 3

4

文字列の連結や置換を使用して値を SQL ステートメントに挿入しないでください。これにより、フォーマットの問題が発生し (ご覧のとおり)、SQL インジェクション攻撃が可能になります。

代わりに、パラメーターを使用します。

$stmt = $db->prepare('INSERT INTO wifinTb(mac,ssid,lat,lon) VALUES (?,?,?,?)');
$stmt->bindValue(1, 'test');
$stmt->bindValue(2, $_POST['ssid']);
$stmt->bindValue(3, $_POST['lat']);
$stmt->bindValue(4, $_POST['lon']);
$stmt->execute();

$stmt = $db->prepare('SELECT * FROM wifinTb WHERE mac = :mac');
$stmt->bindValue(':mac', $mac);
$result = $stmt->execute();
于 2013-10-12T15:19:21.850 に答える
0
$result = $db->query('SELECT * FROM wifinTb WHERE mac=$mac');

現在、1 つの長い文字列と見なされています。次のように変更することで、これをすばやく回避できます。

$result = $db->query("SELECT * FROM wifinTb WHERE mac='" . $mac . "'");

ただし、そのように注入するよりも、PDO や mysqli バインド関数を読んだほうがよいでしょう。

それが役立つことを願っていますか?

于 2013-10-12T11:49:04.747 に答える
0

で初期化$macする'test'のは、文字列 (PHP は内部''または""文字列として認識します) を に割り当てること$macです。この文字列の値は ですtest。したがって、クエリの値を次のように囲む必要があります''

$db->exec("INSERT INTO wifinTb (mac,ssid,lat,lon) VALUES ('$mac','$ssid','$lat','$lon')");
于 2013-10-12T11:49:08.503 に答える