2013-04-26 30 views
2

如果提交表单并且用户没有填写所有表单,我想写空变量。mysqli用php的替代变量覆盖空帖子

我的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(); 

现在简单的东西,我想的是:如果用户不填写名称,它返回匿名......而如果用户不填写味精,我想用变量$cit

我试过不过几件事没有取得成功的填补出来...我想什么

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

等等

我试着把这个代码放在查询的上面和下面,但什么都没有发生。

+0

_“...什么都没有发生。”_ - ?那是什么意思?什么被插入到数据库中? – ShuklaSannidhya 2013-04-26 06:53:09

+0

如果你提交$ _POST ['msg']而没有任何内容,它就会进入数据库,没有任何东西在 – user1775570 2013-04-26 06:54:30

回答

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']); 
0

这是错误的想法。

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

所以,就让它直接进入数据库。何时需要将其回显 - 以任何您想要的方式将其格式化 - “匿名”或某种图像或其他方式。它实际上是查看责任,而所有这些东西都与数据库无关。因此,所有你需要的只是把你所有的东西写入表格。但是,使用mysqli来实现它将是一种痛苦。这就是为什么你必须使用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); 
+0

Ofcourse,我只是沉溺于这个问题,使它更容易回答。这个问题与上下文无关,但@Phil给我的答案正是我所期待的。 – user1775570 2013-04-26 07:04:59

+0

是不是关于mysqli的这个问题,虽然最好使用PDO为什么你要回答一个单独的问题? – ramr 2013-04-26 07:13:16