mysqli用来自php的备用变量覆盖空帖子

时间:2013-04-26 06:46:39

标签: php forms validation mysqli

如果表单已提交且用户未填写所有表单,我想写空变量。

我的mysqli查询看起来像这样

$stmt = $con->prepare("INSERT INTO test (msg, name, time)
VALUES (?, ?, ?)");
$stmt->bind_param('sss', $_POST[msg],$_POST[name],$_POST[main]);
$stmt->execute();
$stmt->close();

现在简单到我想要的是:如果用户没有填写名称以便匿名返回...并且如果用户没有填写msg我想填写它使用变量$cit

我尝试了一些事情,但没有取得任何成功......我尝试了什么

if(isset($_POST['submit'])){
    if(empty($_POST['msg'])){
        $stmt->bind_param('s', 'anonymous');
    }      
}

等等

我尝试将该代码放在查询的上方和下方,但没有任何反应。

2 个答案:

答案 0 :(得分:4)

使用bind_param()时,必须绑定变量而不是数字或字符串文字等常量(例如'anonymous')。

我建议您构建一些默认值,然后覆盖$_POST值的那些值,例如

$defaults = array(
    'msg'  => $cit,
    'name' => 'anonymous',
    'main' => 'some other value'
);

$values = array_merge($defaults, array_filter($_POST));

// snip

$stmt->bind_param('sss', $values['msg'], $values['name'], $values['main']);

答案 1 :(得分:0)

这是错误的想法。

经验法则是:在输出中格式化您的数据,而不是输入。

所以,让它按原样进入数据库。什么时候回应它 - 按照你想要的方式格式化它 - “匿名”或某些图像或其他什么。它实际上是 view 责任,所有这些东西都与数据库无关。

因此,你所需要的只是写出你所有的东西。但是,使用mysqli实现它将是一个PAIN。这就是为什么你必须使用PDO(虽然还需要一个小帮助函数),这将允许你轻松绑定任意大小的数组

基于tag wiki的解决方案(滚动到最底部):

// First, list all the fields a user allowed to
$allowed = array("col1","col2","col3");

// next, create a SET statement query dynamically
// as well as create an array of values 
$set = pdoSet($fields,$values, $update);

// finally, run your dynamically built query
$sql = "UPDATE users SET $set WHERE id = :id";
$stm = $dbh->prepare($sql);
$stm->execute($values);