使用准备好的语句的 PHP 注册脚本

Posted

技术标签:

【中文标题】使用准备好的语句的 PHP 注册脚本【英文标题】:PHP Registration script using prepared statements 【发布时间】:2013-11-13 18:00:10 【问题描述】:

我有以下注册码,它似乎可以正常工作,但实际上并没有将输入的信息插入我的表格中。这一切都运行,没有出现任何错误,并且“echo 'end';”正在显示。

编辑、更新代码: 现在得到这个错误

警告:mysqli_stmt::bind_param(): 类型中的元素数 定义字符串与中的绑定变量数不匹配 C:\xampp\htdocs\ppa\test.php 第 19 行

这是哪一行:

$insert_stmt->bind_param($email, $password, $random_salt, $user);

PHP:

   <?php
include "includes/db_connect.php";

if (isset($_POST['email'], $_POST['p'])) 
    $email = $_POST['email'];
    //Default user perms
    $perms = "user";

    $password = hash('sha512', $_POST['p']); //Need to add javascript to hash password before it gets here
    //Create random salt
    $random_salt = hash('sha512', uniqid(mt_rand(1, getrandmax()), true));

    //Create salted password
    $password = hash('sha512', $password.$random_salt);

    //Add insert to database script
    //Use prepared statements!
    if ($insert_stmt = $mysqli->prepare("INSERT INTO users (email, password, salt, perms) VALUES (?, ?, ?, ?)")) 
        $insert_stmt->bind_param($email, $password, $random_salt, $perms);
        $insert_stmt->execute();
    
    echo "Email: ".$email."<br />";
    echo "Password: ".$password."<br />";
    echo "Random Salt: ".$random_salt."<br />";
    echo "Permissions: ".$perms."<br />";

?>

这是我的 db_connect.php 页面

<?php
define("HOST", 'localhost');
define("USER", 'ppa_user');
define("PASSWORD", 'password');
define("DATABASE", 'ppa');

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);

if ($mysqli->connect_errno) 
    //No database found, redirect to setup
    $url = "http://".$_SERVER['HTTP_HOST'].'/ppa/setup.php';
    header('Location: '.$url);

?>

【问题讨论】:

您的查询正在为users 表上的4 列准备sql 语句,但是,您正在绑定5 参数。这似乎不对。在$_POST['email']之前删除'ssss' 你在哪里看到 5 个参数,或者我错过了什么? @LatheesanKanes 好的,现在试试$insert_stmt-&gt;bind_param("ssss", $email, $password, $random_salt, $perms); @Fred-ii- 它现在适用于:'bind_param("ssss", $email, $password, $random_salt, $perms)'。 m59 - 我现在正在阅读那个链接,非常有趣,我会看看它谢谢。 @Fred-ii- 你能把它放在一个答案中,这样我就可以接受它作为答案。谢谢。 【参考方案1】:

为了结束这个问题的回答,得出的结论是 OP 需要使用以下代码:

$insert_stmt->bind_param("ssss", $email, $password, $random_salt, $perms);

【讨论】:

【参考方案2】:

替换以下内容:

//Add insert to database script
    //Use prepared statements!
    if ($insert_stmt = $mysqli->prepare("INSERT INTO users (email, password, salt, perms) VALUES (?, ?, ?, ?)"));
    $insert_stmt->bind_param('ssss', $_POST['email'], $password, $random_salt, $user);

//Execute the prepared query
$insert_stmt->execute();
echo "end";

与:

//Add insert to database script
//Use prepared statements!
if ($insert_stmt = $mysqli->prepare("INSERT INTO users (email, password, salt, perms) VALUES (?, ?, ?, ?)")) 
    $insert_stmt->bind_param($_POST['email'], $password, $random_salt, $user);
    $insert_stmt->execute();
    echo "end";

【讨论】:

现在出现此错误:警告:mysqli_stmt::bind_param():类型定义字符串中的元素数与 C:\xampp\htdocs\ppa\test.php 中的绑定变量数不匹配在第 19 行 对不起,我忘了从我的回答中删除 ssss。更新后,立即尝试。 不,你确实删除了它,我也删除了它,但它仍然不起作用,得到我上面发布的错误。 然后尝试将您的$_POST['email'] 定义为$email,如$email=$_POST['email']; 然后使用$insert_stmt-&gt;bind_param($email, $password, $random_salt, $user); 我认为是括号与$_POST 玩了一些有趣的把戏。 @MartynLeeBall【参考方案3】:

检查一下

if ($insert_stmt = $mysqli->prepare("INSERT INTO users (email, password, salt, perms) VALUES (?, ?, ?, ?)"));
$insert_stmt->execute(array($_POST['email'], $password, $random_salt, $user));

【讨论】:

警告:第 19 行 C:\xampp\htdocs\ppa\test.php 中 mysqli_stmt::bind_param() 的参数计数错误 使用这个 if ($insert_stmt = $mysqli->prepare("INSERT INTO users (email, password, salt, perms) VALUES (:email, :pass, :salt, :perms)") ); $insert_stmt->execute(array(':email' =>$_POST['email'], ':pass' => $password, ':salt' => $random_salt, ':perms' =>$user)) ;

以上是关于使用准备好的语句的 PHP 注册脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中创建准备好的语句

创建 MySQL 准备好的语句

MySQLi:使用一个准备好的语句插入多行

在 PHP 中到处使用准备好的语句? (PDO)

使用 PHP 和 MSSQL 准备好的语句

PHP:使用准备好的语句并防止 SQL 注入与逃逸