我正在尝试编写一个PHP函数,它将按以下几行生成动态MySQL查询:
sprintf("INSERT INTO %s VALUES ($arbitrary_length_type_list)", $arbitrary_length_argument_list);
我已经成功编写了一个生成$ arbitrary_length_type_list的短例程。它看起来像这样:
$type_list = '';
$db_map = array('table_1' => array('record_id', 'foreign_key_id', 'string_value_1', 'string_value_2'),
'table_2' = array('record_id', 'value_1', 'value_2'));
$table = 'table_1';
foreach($db_map[$table] as $arg){
if(substr_compare($arg, '_id', -3, 3) == 0){
$type_list.= ', %d';
}else{
$type_list.= ', \'%s\'';
}
}
sprintf("INSERT INTO %s VALUES ($type_list)", $argument_list);
我的难点在于sprintf()的$ argument_list(在我的第一个代码示例中称为$ arbitrary_length_argument_list),它不能是单个字符串或数组,但必须是单独的逗号分隔变量或值。有没有办法获取数组或字符串并将其格式化为逗号分隔的变量或值列表,这些变量或值将被sprintf()接受?
澄清一下,这就是我想要输出上述例程的内容:
sprintf("INSERT into %s VALUES (%d, %d, '%s', '%s')", $table, $record_id, $foreign_key_id, $string_value_1, $string_value_2);
或者,替代变量名称,实际值,如下:
sprintf("INSERT into %s VALUES (%d, %d, '%s', '%s')", 'table_1', NULL, 1, 'string_value_1', 'string_value_2');
我不能使用implode()来创建参数列表('table_1',NULL,1,'string_value_1','string_value_2'),因为该函数会生成一个字符串而sprintf()将不接受以下内容:
sprintf("INSERT into %s VALUES (%d, %d, '%s', '%s')", 'table_1, NULL, 1, string_value_1, string_value_2');
[注意引号的不同位置]
或者这个:
sprintf("INSERT into %s VALUES (%d, %d, '%s', '%s')", array('table_1', NULL, 1, 'string_value_1', 'string_value_2'));
在这两种情况下,它都会给我一个“错误的参数数量”错误。
这也不起作用:
$args = $db_map['table_1'];
sprintf("INSERT into %s VALUES (%d, %d, '%s', '%s')", function(){foreach($args as $k => $v){${$k} = $v;}});
在最后一种情况下,错误是“无法将闭包转换为字符串”。
也许比我更有经验的人有解决方案?
答案 0 :(得分:0)
是
如果$ value是数组
implode( ',', $value);
如果$ value是字符串
str_replace(' ', ',', $value );