mysqli 用 php 中的备用变量覆盖空帖子
Posted
技术标签:
【中文标题】mysqli 用 php 中的备用变量覆盖空帖子【英文标题】:mysqli overwriting empty posts with alternate variables from php 【发布时间】:2013-04-20 06:22:54 【问题描述】:如果表单已提交并且用户没有填写所有表单,我想覆盖空变量。
我的 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');
等等等等
我尝试将该代码放在查询的上方和下方,但没有任何反应。
【问题讨论】:
"...什么也没发生。" - ?那是什么意思?什么被插入到数据库中? 如果你提交 $_POST['msg'] 里面什么都没有,它会进入数据库,里面什么都没有 【参考方案1】:使用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']);
【讨论】:
【参考方案2】:这是错误的想法。
经验法则是:在输出时格式化数据,而不是在输入时。
所以,让它按原样进入数据库。当需要回显它时 - 以任何你想要的方式格式化它 - “匿名”或一些图像或其他任何东西。这实际上是 view 的责任,而所有这些东西都与数据库无关。
因此,您只需将所有内容写入表格即可。但是,使用 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);
【讨论】:
当然,我只是简化了这个问题,以便更容易回答。这个问题与上下文无关,但@Phil 给我的答案正是我想要的。 这不是关于 mysqli 的问题吗,虽然使用 PDO 更好,但为什么要回答一个单独的问题?以上是关于mysqli 用 php 中的备用变量覆盖空帖子的主要内容,如果未能解决你的问题,请参考以下文章