首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有可选表单字段的动态预准备插入语句

具有可选表单字段的动态预准备插入语句
EN

Stack Overflow用户
提问于 2015-11-17 09:24:15
回答 2查看 80关注 0票数 0

所以我在几年前找到了这个问题/答案,它与我需要的相似,但我认为我没有正确理解它。如果表单中的可选字段导致$_POST字段计数和数据库字段计数不同,会发生什么情况?

代码语言:javascript
运行
复制
function insertToDB($params, $db) { //Pass array and db

    $fields = array();
    $conn = new mysqli('localhost', 'root', 'root', 'db') or die('XXX');     
    $stmt =  $conn->stmt_init();
    $stmt->prepare("SELECT * FROM ".$db); 
    $stmt->execute();
    $meta =  $stmt->result_metadata();
    while ($field = $meta->fetch_field()) { 
         $fields[] = $field->name;   
    }

    $fields = implode(", ", $fields);


    $placeholders = implode(',', array_fill(0, count($params), '?'));

    $types = '';
    foreach($params as $value) {
        $types.= substr(strtolower(gettype($value)), 0, 1); 
    }

    $ins = "INSERT INTO MYDB (".$fields.") VALUES (".$placeholders.")"; 

    $bind_names[] = $types; 
    for ($i = 0; $i < count($params); $i++) { 
        $bind_name = 'bind' . $i;
        $$bind_name = $params[$i];
        $bind_names[] = &$$bind_name;
    }
    if ($stmt->prepare($ins)) {
            call_user_func_array(array($stmt,'bind_param'),$bind_names); 
            $insresult = $stmt->execute(); 
    }
    return $insresult;
    $stmt->close();
}
EN

回答 2

Stack Overflow用户

发布于 2015-11-17 09:47:33

如果一个字段是可选的,那么你应该检查是否设置了$_POST,你可以这样做:

代码语言:javascript
运行
复制
if(isset($_POST["fieldsection"])) {
$var = $_POST["fieldsection"];
} else {
$var = "Default Value"
}

这样,字段计数和mysql计数可以总是相同的,因为它会查看是否有选择,如果没有选择,它会为您设置一个。

票数 0
EN

Stack Overflow用户

发布于 2015-11-17 11:13:09

从一个简单的示例开始,假设您有以下表字段

代码语言:javascript
运行
复制
$table_fields = array('foo', 'bar', 'baz');

您输入的数据如下所示

代码语言:javascript
运行
复制
$input_data = array('foo' => 1,
                    'bar' => 2);

您所能做的就是为每个表字段设置一些默认输入数据(我很懒,所以默认都是NULL)

代码语言:javascript
运行
复制
array_fill(0, count($table_fields), NULL)

然后我们用array_combine将它们压缩在一起

代码语言:javascript
运行
复制
array_combine($table_fields, array_fill(0, count($table_fields), NULL))

这样,您的输入数据就可以随时使用array_merge覆盖默认值,如下所示

代码语言:javascript
运行
复制
var_dump(
    array_merge(
        array_combine($table_fields, array_fill(0, count($table_fields), NULL)),
        $input_data
    )
);

# prints
# array(3) {
#  ["foo"]=>
#  int(1)
#  ["bar"]=>
#  int(2)
#  ["baz"]=>
#  NULL
#}

但是,如果可能的话,您是否可以尝试将可选字段设置为真正可选的字段,以便在CREATE TABLE语句中确保为这些字段设置了默认值?在这种情况下,您还将保存一轮到数据库中以查询字段名($stmt->prepare("SELECT * FROM ".$db);,如果您确实需要的话,您可以使用LIMIT 1来加速它)。所以取而代之的是这行

代码语言:javascript
运行
复制
$ins = "INSERT INTO MYDB (".$fields.") VALUES (".$placeholders.")";

将会变成

代码语言:javascript
运行
复制
$ins = "INSERT INTO MYDB (".implode(",", array_keys($params)).") VALUES (".$placeholders.")"; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33747611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档