php-将多维数组简化为查询字符串
今天下午我一直在为我的用例寻找一个可行的解决方案。我还没找到 用例:将数组转换为这样的格式:在PDO insert语句中,数组键是列,数组值是SQL值。如果此请求与其他请求重复,我道歉。我还没有找到一个适合我的。在我的示例中,父数组是php-将多维数组简化为查询字符串,php,mysql,sql,arrays,pdo,Php,Mysql,Sql,Arrays,Pdo,今天下午我一直在为我的用例寻找一个可行的解决方案。我还没找到 用例:将数组转换为这样的格式:在PDO insert语句中,数组键是列,数组值是SQL值。如果此请求与其他请求重复,我道歉。我还没有找到一个适合我的。在我的示例中,父数组是array[0],插入到一个表中,array[1]是子数组。它们被迭代并插入到另一个表中,使用fk\u user\u id作为外键 插入示例: $sth=$dbh->prepare(“插入$table($colData)值($valData)”) 因此,列将是(ke
array[0]
,插入到一个表中,array[1]
是子数组。它们被迭代并插入到另一个表中,使用fk\u user\u id
作为外键
插入示例:
$sth=$dbh->prepare(“插入$table($colData)值($valData)”)代码>
因此,列将是(key1,key2)
,值将是(:value1,:value2)
,依此类推。我在多维和提取子节点等方面遇到了各种各样的问题
示例数组:
[INFO] Array
(
[0] => Array
(
[last_visit] => 1389393273.19
[first_visit] => 1389313338.69
[this_visit] => 1389393265.75
[latitude] => 37.7858352661
[longitude] => -122.406417847
[opted_out] => 0
[opted_in] => 0
[user_id] => 1
[locale] => en
[device_maker] => unknown
[device_model] => Simulator
[os_platform] => iPhone OS
[os_version] => 7.0.3
[modified] => 1389393273.19
[model_type] => tracker
)
[1] => Array
(
[0] => Array
(
[view_count] => 1
[visit_timestamp] => 1389393265.63
[page_viewed] => home
[page_id] => 320
[fk_user_id] => 1
[model_type] => page
)
[1] => Array
(
[view_count] => 2
[visit_timestamp] => 1389393265.64
[page_viewed] => contactView
[page_id] => 321
[fk_user_id] => 1
[model_type] => page
)
)
)
我尝试过的解决方案
,
,
,
等等。我可能对代码太深了,以致于无法透视数据。我已经有一段时间没有使用PHP了,所以我的技能需要提高。非常感谢您的帮助。从安全角度来看,以此处所述的方式将表单输入动态映射到SQL列是一个糟糕的想法。任何人都可以通过构造匹配的POST请求将任何数据转储到任何列中
此外,通过将表单值直接插入SQL字符串,您很容易受到SQL注入的攻击。任何人都可以提交假POST请求并执行任意SQL,这将暴露或损坏数据库中的任何表
给出该警告后,您需要使用PHP的foreach
在循环内部,您必须在每次迭代中构建两个字符串。第一个包含列名(表名后的逗号分隔列表)。第二个包含值
在这之后,您必须获得最后一条插入记录的ID,PDO有一个函数用于此。然后,您必须对每个相关记录重复此技术
如果你想要一个更好的解决方案,考虑使用一个像LaaVIEW这样的框架,它包括一个称为逻辑ORM的对象关系映射器库。这将使此类操作更简单,编程更安全。
我为您准备了一个可能的解决方案,该解决方案还考虑使用多维数组(无限数量的子数组)
该解决方案是一个基于递归的函数,返回一个包含col(需要插入到db中)的数组、行和包含子级的数组
您可以在输出数组中循环,也可以静态地使用它的某些元素。
看一看
<?php
$arr = array(
'key1' => 'val1',
'key2' => 'val2',
'key3' => 'val3',
'key4' => array(
'subkey1' => 'subval1',
'subkey2' => 'subval2',
)
);
function walkArray($input)
{
// Define our output array
$output = array(
'keys' => '',
'vals' => '',
'children' => array(),
);
// We're looping trough the input array
foreach($input AS $key => $value)
{
// If the current value is an array we reached the next dimension
if(is_array($value))
{
// So we call walkArray() recursively with our current value
// and assign the returned array to a new element in our $output's 'children' key
$output['children'][] = walkArray($value);
}
else
{
// We'll concatenate our keys and values...
$output['keys'] .= $key . ', ';
$output['vals'] .= ':' . $value .', ';
}
}
// And get rid of the trailing commas
$output['keys'] = rtrim($output['keys'], ', ');
$output['vals'] = rtrim($output['vals'], ', ');
// Eventually we return our output array
return $output;
}
?>
<pre>
<?php
print_r(walkArray($arr));
?>
</pre>
是否有两个维度的最大值,或者有无限多的子元素?您是否考虑过json_编码?它并没有尽可能紧凑,但可能会满足您的目的。您如何知道OP正在尝试将表单输入映射到数据库?谢谢@Niels。这是一个用于移动应用程序的后端php Web服务。将无法访问URL。而且,幸运的是,我想我在发布请求后就找到了答案@托马斯戴维普拉特:你是正确的。这不是表格数据。@Thomas David Plat-我的错,你是对的。当然,在我对过度设计的热情中,最简单的解决方案常常被忽视。对于COL和VAL:$columns=array\u键($tracks)$值=数组值($tracks)代码>对于准备好的语句:$query=“插入到$table(“.inpolde(“,”,$columns)。”)值(“.inpolde(“,”,$VALUES)。”)”代码>我将其输出到控制台并得到正确的查询。干杯我来测试一下。如果对我有效,我会把它标为最佳答案。谢谢,托马斯。
<?php
$arr = array(
'key1' => 'val1',
'key2' => 'val2',
'key3' => 'val3',
'key4' => array(
'subkey1' => 'subval1',
'subkey2' => 'subval2',
)
);
function walkArray($input)
{
// Define our output array
$output = array(
'keys' => '',
'vals' => '',
'children' => array(),
);
// We're looping trough the input array
foreach($input AS $key => $value)
{
// If the current value is an array we reached the next dimension
if(is_array($value))
{
// So we call walkArray() recursively with our current value
// and assign the returned array to a new element in our $output's 'children' key
$output['children'][] = walkArray($value);
}
else
{
// We'll concatenate our keys and values...
$output['keys'] .= $key . ', ';
$output['vals'] .= ':' . $value .', ';
}
}
// And get rid of the trailing commas
$output['keys'] = rtrim($output['keys'], ', ');
$output['vals'] = rtrim($output['vals'], ', ');
// Eventually we return our output array
return $output;
}
?>
<pre>
<?php
print_r(walkArray($arr));
?>
</pre>
Array
(
[keys] => key1, key2, key3
[vals] => :val1, :val2, :val3
[children] => Array
(
[0] => Array
(
[keys] => subkey1, subkey2
[vals] => :subval1, :subval2
[children] => Array
(
)
)
)
)