所以我最近改用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->查询($ current)或死亡($ mysqli->错误。 LINE );
第一个问题,这是正确的方法吗?
它比mysql_方法更安全吗? (我听说它可以防止注射或其他事情)
最后,除了现在使用MySQLi之外,我还应该做些什么?我的代码是否足够安全?
我以前在mysql查询中使用的任何数据上使用了mysql_real_escape_string(htmlspecialchars($ string),我还需要使用它吗?因为我现在正在使用MySQLi。
我应该注意哪些其他事项才能确保我的网站安全? htmlspecialchars任何用户输入?
谢谢!
答案 0 :(得分:2)
mysqli_query
使用:它比mysql_方法更安全吗? (我听说它可以防止注射或其他事情)
此处您没有注射问题,因为您不使用任何用户输入。所以mysql_或mysqli_
似乎是等价的。
但是,如果必须使用用户输入(例如$_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_assoc
或fectch_object
的整个mysqli_result API中删除。
$stmt->bindResult($array['col1'], $array['col2'], $array['col3']);
$stmt->execute();
while($stmt->fetch_assoc()){
var_dump($array);
}
第二名:使用get_result
。它允许您在使用mysqli_result
时使用已经使用的$db->query()
API。它仅在您使用mysqlnd作为驱动程序时可用。如果你在php 5.3+以下,这是默认的驱动程序,但是使用php 5.1或5.2(基本上,1& 1主机是在5.2之下),这并不总是那样。
$stmt->execute();
$result = $stmt->get_result()->fetch_all();
foreach($result as $row){
//handle your rows
}
mysql_real_escape_string(用htmlspecialchars($字符串))
在mysqli中,您可以使用mysqli_real_escape_string
。关于数据库,htmlspecialchars
函数是无用的。它仅用于显示。