繁体   English   中英

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

[英]mysqli overwriting empty posts with alternate variables from 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');
    }      
}

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

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

这是错误的想法。

经验法则是: 在输出处而不是在输入处格式化数据

因此,只需将其原样放入数据库即可。 当需要回显它时-以任何您想要的方式对其进行格式设置-“匿名”或某些图像或其他任何内容。 它实际上是视图责任,而所有这些东西都与数据库无关。

因此,您所需要做的就是将您已编写的所有内容写到表中。 但是,使用mysqli来实现它是一个痛苦。 这就是为什么您必须使用PDO(尽管仍然需要一些辅助功能)的原因,这将使您可以轻松地绑定任意大小的数组

一个基于标签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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM