mysqli准备了声明和用户卫生

时间:2013-12-27 19:58:38

标签: php mysql mysqli

我这样做了吗?

$user = $_POST['username'];
$email = $_POST['usermail'];

$stmt = $mysqli->stmt_init();
if (!$stmt) {
    echo "Init failed";
} else {
    $cmd = "INSERT INTO people (username, email, sign_up_date) VALUES (?, ?, NOW() )";
    if ($stmt->prepare($cmd)) {
        $stmt->bind_param('ss', $user, $email );
        $stmt->execute();

        echo $stmt->affected_rows . " row(s) inserted";

        $stmt->close();

    } else {
        echo "Prepare failed";
    }
    mysqli_close($mysqli);
    }

这是我的表格:

<section class="loginform tmr">
    <form name="login" action="regi.php" method="post" accept-charset="utf-8">
        <label for="username">Username: </label><br />
            <input type="username" name="username" placeholder="Handle" required><br />
            <input type="hidden" name="sign_up_date" value="<?php echo $_POST['sign_up_date'] ?>">
        <label for="usermail">Email: </label><br />
            <input type="email" name="usermail" placeholder="yourname@email.com" required><br />
        <label for="password">Password: </label><br />
            <input type="password" name="password" placeholder="password" required><br />
            <input type="submit" value="Login">
    </form>
    </section>

2 个答案:

答案 0 :(得分:2)

这取决于你对“正确”的定义。

尽管许多准备好的语句示例都显示了这种基本上直接将输入数据插入到预准备语句中的方法(这就是你正在做的事情,只需要将数据分配给新变量名称的额外步骤),我个人甚至都不会开始任务如果我之前没有验证所有必需的输入,那么在数据库上准备一个语句。例如,即使没有POST数据传递给脚本,您的代码也会执行。当然这不是理想的行为。

最低限度,您应该检查POST值的!empty()。我还建议使用以下内容验证电子邮件地址格式:

$email = filter_input(INPUT_POST, 'usermail', FILTER_VALIDATE_EMAIL);
if (false === $email) {
    // validation failed
}

你也可能有username左右的要求(比如没有空格,X个最大字符数等)你应该验证(至少,我会验证字符串长度不是超过DB中字段的大小。

答案 1 :(得分:1)

捕获到中间变量几乎没有意义,你可以直接绑定$_POST变量,但除此之外,这就是你使用mysqli的方法。对于生产质量工作来说,这有点粗糙和坚固,看到“Bind failed”这样的东西不会对你的用户有所帮助,但这是可以改进的。

有两件事可以真正改善这一点:

  • 使用DoctrinePropel之类的ORM来抽象数据库调用,并将大量低级数据库内容保留在您的视图之外。
  • 使用development framework使您的应用程序更加标准化,可维护,并打开一个可以无缝插入的庞大的社区代码库。