【问题标题】:Trouble sanitizing form with prepared statement使用准备好的语句清理表格时遇到问题
【发布时间】:2016-12-13 10:25:53
【问题描述】:

你好,我希望能分享光。我相信到目前为止取得了进展。我在这里注册:

我想做的是在发送数据库之前对我的数据进行清理。

    <?php


    session_start(); 
    if(is_file('include/connection.php'))
    include_once('include/connection.php');
    else
    exit('Database FILES MISSING:(');


    if(isset($_POST['submit'])) {
        $errors = array();
       $data = array();
        $name = mysqli_real_escape_string($_POST['name']);
        $last_name = $_POST['last_name'];
        $user_name = $_POST['user_name'];
        $user_type = $_POST['user_type'];
        $email = $_POST['email'];
        $password = $_POST['password'];
        $confirm_password = $_POST['confirm_password'];  
     // $created_at = $_POST['created_at'];
        $password_hash = password_hash($password, PASSWORD_DEFAULT);    

      //$created_at = date('Y-m-d');
        if(!($stmt = $mysqli->prepare("INSERT INTO user (name, last_name, user_name, user_type, email, password) 
            VALUES (?,?,?,?,?,?)"))){
            echo "Prepare failed: (" . $mysqli->errno . ")" . $mysqli->error;
        }

        if(!$stmt->bind_param('ssssss', $name, $last_name, $user_name, $user_type, $email, $password_hash)){
         echo "Binding paramaters failed:(" . $stmt->errno . ")" . $stmt->error;
        }

        if(!$stmt->execute()){
         echo "Execute failed: (" . $stmt->errno .")" . $stmt->error;
        }

        if($stmt) {
            $_SESSION['main_notice'] = "Successfully registered, login here!";
            header('Location: index.php');

        }
        else{
            echo "Registration failed";
        }

    }

    $mysqli->close();

    ?>

执行失败:(1048)列“名称”不能为空

以上是我提交数据时遇到的错误。

尝试使用mysqli_real_escape_string AND mysqli-&gt;real_escape_string

如果我仍然需要缎面化,即使已经绑定了数据,可以提供一些建议。


我还在我的数据库中创建了 created_at 字段。见下面的代码。

        $created_at = $_POST['created_at'];
        $password_hash = password_hash($password, PASSWORD_DEFAULT);    

      $created_at = date('Y-m-d');
        if(!($stmt = $mysqli->prepare("INSERT INTO user (name, last_name, user_name, user_type, email, password, created_at) 
            VALUES (?,?,?,?,?,?)"))){
            echo "Prepare failed: (" . $mysqli->errno . ")" . $mysqli->error;
        }

        if(!$stmt->bind_param('ssssss', $name, $last_name, $user_name, $user_type, $email, $password_hash, $created_at)){
         echo "Binding paramaters failed:(" . $stmt->errno . ")" . $stmt->error;
        }

我得到这个错误:

准备失败:(1136)列计数与第 1 行的值计数不匹配 致命错误:在第 30 行的 /home/olami560/public_html/project/allocation/progress/register.php 中的非对象上调用成员函数 bind_param()

您的帮助将不胜感激。谢谢

【问题讨论】:

  • 您有 6 个问号,但要插入 7 个值。

标签: php mysql forms validation mysqli


【解决方案1】:

问题 #1,mysqli_real_escape_string 在程序上使用时需要连接链接。绑定时不需要逃跑。如果您要逃脱,那将是:

$name = mysqli_real_escape_string($mysqli, $_POST['name']);

$name = $mysqli->real_escape_string($_POST['name']);

问题 #2,您列出了 7 列,尝试写入 7 个值,但只有 6 个占位符和 6 个字符串类型。

所以更新到:

 if(!($stmt = $mysqli->prepare("INSERT INTO user (name, last_name, user_name, user_type, email, password, created_at) 
            VALUES (?,?,?,?,?,?,?)"))){
            echo "Prepare failed: (" . $mysqli->errno . ")" . $mysqli->error;
        }

        if(!$stmt->bind_param('sssssss', $name, $last_name, $user_name, $user_type, $email, $password_hash, $created_at)){
         echo "Binding paramaters failed:(" . $stmt->errno . ")" . $stmt->error;
        }

注意?s 的数量,这些是占位符,以及bind_paramss 的数量。如果缺失值是整数,而不是字符串,则将最后一个 s 更改为 i 或任何数据类型。

【讨论】:

  • 嗨 chris85,很抱歉回复...这对我来说非常有效,这是我的错误。你确实提到,虽然我使用程序我不需要逃避,它会让我变数还是??
  • 不,驱动程序处理转义和引用。你不应该逃跑。
  • 哦,太棒了。感谢您的贡献。我想请一个大忙。如果没有身体,我不会。虽然使用了 stmt 程序......但在我的登录页面中,我有点坚持我如何着手准备刚刚在注册页面中完成的代码。
  • 哦,代码对于注释来说太大了。我需要提出一个新问题吗?
  • 这应该是您在此处使用的相同过程。任何输入到 SQL 的地方都应该是一个占位符。驱动程序处理查询、引用和转义的插入。
猜你喜欢
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2011-07-13
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多