Php 如何安全地使用MySQLi?

Php 如何安全地使用MySQLi?,php,mysql,mysqli,Php,Mysql,Mysqli,所以我最近改用MySQLi。我有几个问题要问 我当前获取数据的代码是 $current = "SELECT * FROM hi where username='me'"; $result = $connect->query($current) or die($mysqli->error.__LINE__); $row = $result->fetch_assoc(); 我对查询的执行是 $current=“从hi中选择*,其中username='me'”; $result=$

所以我最近改用MySQLi。我有几个问题要问

我当前获取数据的代码是

$current = "SELECT * FROM hi where username='me'";
$result = $connect->query($current) or die($mysqli->error.__LINE__);
$row = $result->fetch_assoc();
我对查询的执行是

$current=“从hi中选择*,其中username='me'”; $result=$connect->query($current)或die($mysqli->error.

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

它如何比mysql方法更安全?(我听说它能阻止注射之类的)

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

我以前在mysql查询中使用过mysql\u real\u escape\u string(htmlspecialchars($string)来处理任何数据,我还需要使用它们吗?因为我现在使用的是MySQLi

我还应该注意哪些事项来保护我的网站?htmlspecialchars用户输入

谢谢!

关于您的
mysqli\u查询
使用: 它是如何比mysql方法更安全的呢?(我听说它可以防止注射之类的)

这里您没有注入问题,因为您没有使用任何用户输入。因此mysql_uu或
mysqli_uuu
似乎是等效的

关于注射问题: 但是,如果必须使用用户输入(例如
$\u POST
$\u 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
    。必须在执行之前调用此函数。它将结果绑定到您在参数中提供的变量。第一列将填充第一个变量,第二列将填充第二个参数…主要问题是它将您从整个mysqli_result API中删除,该API具有
    fetch_all
    fetch\u assoc
    fetch\u对象

    $stmt->bindResult($array['col1'], $array['col2'], $array['col3']);
    $stmt->execute();
    while($stmt->fetch_assoc()){
       var_dump($array);
    }
    
  • 第二:使用
    get_result
    。它允许您使用
    mysqli_result
    API,您在使用
    $db->query()
    时已经在使用该API。它仅在使用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\u real\u escape\u字符串(htmlspecialchars($string))


在mysqli中,您可以使用
mysqli\u real\u escape\u string
htmlspecialchars
函数在涉及数据库时是无用的。它仅用于显示。

可能重复的mysql库在这里并不等效,因为mysqli在查询中使用连接来转义,所以他不使用mysql\u real\u escape\u string这是PHP5.3的标准(可能是强制性的)在mysql_real_escape_string函数中提供连接参数。mysqli的优势在于持久连接、预处理语句和MySQL5.1+功能支持。啊,我的错。mysqli>mysql,但我对ext/mysqlHey中的连接转义从不陌生!我在理解预处理语句部分时遇到困难:(如果我只是mysql转义我的帖子或获取?$current=“UPDATE hi set user=$user”;$exec=$connect->query($current)或die($mysqli->error.LINE);$user将被mysql真正转义。@Jason不。阅读我在你的问题下链接的大量信息。学习准备好的语句。它们并不难。