1

所以我最近转而使用 MySQLi。我有几个问题。

我当前获取数据的代码是

$current = "SELECT * FROM hi where username='me'";
$result = $connect->query($current) or die($mysqli->error.__LINE__);
$row = $result->fetch_assoc();

我执行的查询是

$current = "SELECT * FROM hi where username='me'"; $result = $connect->query($current) 或 die($mysqli->error.LINE ) ;

第一个问题,这是正确的方法吗?

它比 mysql_ 方法更安全吗?(听说可以防止打针什么的)

最后,除了现在使用 MySQLi,我还应该怎么做呢?我的代码是否足够安全?

我以前对将在 mysql 查询中使用的任何数据使用 mysql_real_escape_string(htmlspecialchars($string),我还需要使用它们吗?因为我现在使用的是 MySQLi。

为了使我的网站安全,我还应该注意哪些其他事项?htmlspecialchars 任何用户输入?

谢谢!

4

1 回答 1

2

关于你的mysqli_query使用:

它比 mysql_ 方法更安全吗?(听说可以防止打针什么的)

在这里您没有注入问题,因为您不使用任何用户输入。所以 mysql_ ormysqli_似乎是等价的。

关于注入问题:

但是,如果您必须使用用户输入(例如$_POST$_GET变量),最好使用准备好的语句。他们的语法是这样的:

$query = SELECT * FROM mytable WHERE col1=? AND col2=?;
$stmt = $db->prepare($query);
$stmt->bind_param('ss',$_POST['col1'],$_POST['col2']);//I put 2 s because I want 2 params. s stands for strings, i for integer. For that part PHP and mysqli extension offers you two alternative syntaxes. They give the same result but it depends on what you understand the best.
  • 第一:使用bind_result. 该函数必须在执行前调用。它将您的结果绑定到您在参数中提供的变量。第一列将填写第一个变量,第二列填写第二个参数...主要问题是它会将您从具有fetch_all,fetch_assocfectch_object.

    $stmt->bindResult($array['col1'], $array['col2'], $array['col3']);
    $stmt->execute();
    while($stmt->fetch_assoc()){
       var_dump($array);
    }
    
  • 第二:使用get_result. 它允许您在mysqli_result使用$db->query(). 它仅在您使用 mysqlnd 作为驱动程序时可用。如果您使用的是 php 5.3+,这是默认驱动程序,但使用 php 5.1 或 5.2(基本上,1&1 hoster 低于 5.2)并不总是这样。

    $stmt->execute();
    $result = $stmt->get_result()->fetch_all();
    foreach($result as $row){
       //handle your rows
    }
    

关于逃避:

mysql_real_escape_string(htmlspecialchars($string))

在 mysqli 中,您可以使用mysqli_real_escape_string. htmlspecialchars当涉及到数据库时,该功能是无用的。它仅用于展示。

于 2013-02-25T07:55:37.127 回答