使用procederal样式编写的PHP插入

使用procederal样式编写的PHP插入,php,mysqli,Php,Mysqli,我正在尝试切换我的注册页面以使用mysqli\u stmt\u prepare procederal样式 它在没有准备的情况下工作得很好,所以我非常确定数据库和其他所有东西都连接正确 我遵循了PHP手册中的说明,但是我一直从PHP中得到一个空白的白页 这是我的密码,如果有人能发现我做错了什么,我将万分感激 我也不确定我是否应该把mysqli_real_escape放在前面 $postuser = mysqli_real_escape_string($con, $_POST['userna

我正在尝试切换我的注册页面以使用mysqli\u stmt\u prepare procederal样式

它在没有准备的情况下工作得很好,所以我非常确定数据库和其他所有东西都连接正确

我遵循了PHP手册中的说明,但是我一直从PHP中得到一个空白的白页

这是我的密码,如果有人能发现我做错了什么,我将万分感激

我也不确定我是否应该把mysqli_real_escape放在前面

    $postuser = mysqli_real_escape_string($con, $_POST['username']);
    $postpass = sha1($_POST['userpass']);
    $postemail = mysqli_real_escape_string($con, $_POST['useremail']);

    $stmt = mysqli_stmt_init($con);
    if (mysqli_stmt_prepare($stmt,'INSERT INTO users (username, userpass, useremail, userdate)
    VALUES(     '" . ? . "', 
                '" . ? . "', 
                '" . ? . "',
                NOW())')) 
    {
    mysqli_stmt_bind_param($stmt, "sss", $postuser, $postpass, $postemail);

    mysqli_stmt_execute($stmt); 

    mysqli_stmt_fetch($stmt);
    } 



    if(!$stmt)  
    {  
        //something went wrong, display the error  
        echo '<ul class="ulstylecenter">
            <li>Something went wrong while signing in. Please try again later.</li>
            <li>If you are not redirected in 5 seconds please <a href="/home.php">click here</a>.</li>
            </ul>'; 
            header('Refresh: 5;url=/home.php');
    }
$postser=mysqli\u real\u escape\u字符串($con,$\u POST['username']);
$postpass=sha1($_POST['userpass']);
$postmail=mysqli\u real\u escape\u字符串($con,$\u POST['useremail']);
$stmt=mysqli\u stmt\u init($con);
if(mysqli_stmt_prepare($stmt,'INSERT INTO users)(用户名、用户密码、用户电子邮件、用户日期)
值(“?”,
'" . ? . "', 
'" . ? . "',
现在()
{
mysqli_stmt_bind_param($stmt,“sss”、$postser、$postpass、$postmail);
mysqli_stmt_execute($stmt);
mysqli_stmt_fetch($stmt);
} 
如果(!$stmt)
{  
//出现问题,请显示错误
echo'
  • 登录时出错。请稍后再试
  • 如果您在5秒内没有被重定向,请
'; 标题('Refresh:5;url=/home.php'); }
当您使用准备好的语句时,您不能转义值,也不能将
占位符放在SQL中的引号中

$postuser = $_POST['username'];
$postpass = sha1($_POST['userpass']);
$postemail = $_POST['useremail'];

$stmt = mysqli_stmt_init($con);
if (mysqli_stmt_prepare($stmt,'INSERT INTO users (username, userpass, useremail, userdate)
VALUES(?, ? ?, NOW()')) 

无论您使用的是过程式还是OO式,这都是一样的——两者之间的唯一区别是调用函数的语法。

当使用准备好的语句作为语句时,您不必对输入进行清理,并且值是单独发送的。但是,当从数据库中显示数据时,您应该清理数据。我已经很久没有使用PHP了,但是我非常确定,不可能回显某些内容然后修改标题,因此您的“else”将无法工作。出于调试目的,您可能更喜欢使用标准错误消息。当上线时,你的方法是可以的,除了你可能想记录错误(这样你就知道有问题)并使用meta redirect或javascript进行重定向…非常有效谢谢,我现在唯一的问题是,mysqli_real_escape在任何地方都需要额外的安全性吗?还是准备好的语句本身就足够安全?它不仅不需要,而且是错误的。将准备好的语句视为转义所有参数。如果你调用
mysqli\u real\u escape\u string
你将对它们进行两次转义。这就是为什么我在回答中写了
不得
而不是
不应