如何将此PDO代码转换为MySQLi?

Nin*_*ino -5 php mysqli pdo

我对PHP和MySQL还是很陌生,我尝试学习如何将代码从PDO更改为MySQLi。它与我在网上找到的登录系统有关的“记住我”功能以及一个安全令牌和标识符。我想学习并了解如何将代码从PDO更改为MySQLi。我知道在MySQLi中有一条创建和准备语句,我也必须绑定参数并执行。但是在这种情况下,我还是不知道如何开始。

$pdo = new PDO('mysql:host=localhost;dbname=dbname', 'root', '');
if (!isset($_SESSION['id']) && isset($_COOKIE['identifier']) &&
isset($_COOKIE['securitytoken'])) {
    $identifier = $_COOKIE['identifier'];
    $securitytoken = $_COOKIE['securitytoken'];

    $statement = $pdo->prepare("SELECT * FROM securitytokens WHERE identifier = ?");
    $result = $statement->execute(array($identifier));
    $securitytoken_row = $statement->fetch();

    if (sha1($securitytoken) !== $securitytoken_row['securitytoken']) {
        die('Maybe a stolen securitytoken.');
    } else {
        //Token was correct
        //Set an new token
        $neuer_securitytoken = random_string();
        $insert = $pdo->prepare("UPDATE securitytokens SET securitytoken = :securitytoken WHERE identifier = :identifier");
        $insert->execute(array('securitytoken' => sha1($neuer_securitytoken), 'identifier' => $identifier));
        setcookie("identifier", $identifier, time() + (3600 * 24 * 365)); //1 Year valid
        setcookie("securitytoken", $neuer_securitytoken, time() + (3600 * 24 * 365)); //1 Year valid

        //Loggin the user
        $_SESSION['id'] = $securitytoken_row['id'];
    }
}
Run Code Online (Sandbox Code Playgroud)

Dha*_*man 6

不要做!PDO更简单,并提供更多功能。

如果您只是想学习MySQLi,就应该牢记以下几点:

  1. 这是您正确打开连接的方式:

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli($host, $user, $pass, $db);
    $mysqli->set_charset($charset);
    
    Run Code Online (Sandbox Code Playgroud)
  2. MySQLi中没有执行中的绑定。实际上,根本没有价值约束!您只能按引用绑定,并且必须指定值的类型。

    $statement = $mysqli->prepare("SELECT * FROM securitytokens WHERE identifier = ?");
    $statement->bind_param('i', $identifier); // i for integer; s for string. 
    $statement->execute();
    
    Run Code Online (Sandbox Code Playgroud)
  3. MySQLi没有命名的占位符,因此您只需要使用位置的占位符。

    $insert = $mysqli->prepare("UPDATE securitytokens SET securitytoken = ? WHERE identifier = ?");
    $sha1ResultDueToPassByRef = sha1($neuer_securitytoken);
    $insert->bind_param('si', $sha1ResultDueToPassByRef, $identifier);
    $insert->execute();
    
    Run Code Online (Sandbox Code Playgroud)
  4. fetchMySQLi中的方法工作原理完全不同,它返回布尔值。要获得与PDOfetch()相同的结果,您需要先get_result()使用fetch_array()fetch_assoc()

    $securitytoken_row = $statement->get_result()->fetch_array();
    
    Run Code Online (Sandbox Code Playgroud)

  • 而且,只有在拥有MYSQLND驱动程序的情况下,将“ fetch_array”或“ fetch_assoc”与预备语句一起使用才有效。 (2认同)
  • 我完全同意。将PDO代码转换为mysqli的每个步骤都揭示了不这样做的更多原因。 (2认同)