簡體   English   中英

每個查詢都需要准備好的語句嗎?

[英]Do I need prepared statement on each query?

$query = "SELECT 1 FROM users WHERE username = :username";
$query_params = array(':username' => $_POST['username']);
try
{
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex)
{
die("Failed to run query: " . $ex->getMessage());
}

$row = $stmt->fetch();
if($row)
{
die("This username is already in use");
}

所有這些都可以,但是:

  1. 如果查詢只是SELECTSELECT COUNT我真的需要准備好的語句嗎?
    因為,如果表上沒有INSERT / UPDATE / DELETE操作-我想SQL注入或垃圾郵件沒有危險嗎?

  2. 每次進入數據庫時​​,我是否真的需要try/catch語句?

如果您在查詢中放入了任何可以以任何方式更改的變量,則您(必須)使用准備好的語句。

即使在SELECT語句上也始終存在SQL注入的危險,因為有人可以終止SELECT並在用戶名中附加INSERT語句。 但是,如果您使用的是mysql_real_escape_string()或您的數據庫類為您轉義了您的值,那么您不必擔心在SELECT語句上進行try / catch。 如果您轉義了值,那么對於您的SQL而言已足夠:

$username = mysql_real_escape_string($username); // escape the string first.
$query = "SELECT 1 FROM users WHERE username = '$username'";

1)不,您不必使用准備好的語句; 您可以使用例如PDO :: query和PDO :: quote來使用字符串連接建立查詢。 但是-是的,無論何時您使用外部提供的字符串,都存在SQL注入損壞的風險,即使您只是執行SELECT也是如此。 例如,攻擊者可能試圖通過使用“;”來在一條語句中運行兩條語句。 在提供的字符串中。 PDO :: quote是防止這種情況的另一種方法。

2)您可以將錯誤排除在調用代碼之外,但是必須在某個地方考慮​​錯誤處理。

就與數據庫的連接而言,這是您唯一需要的方法。 嘗試並捕獲:(如果您使用的是MySql數據庫)

try {
    $conn = new PDO('mysql:host=localhost;dbname=DBNAME', 'USER', 'PASS', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

另外,有一個內置的計數查詢來計數:

$affected_rows = $stmt->rowCount();

如果您不知道這是一個很好的教程

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM