php-将多维数组简化为查询字符串

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

今天下午我一直在为我的用例寻找一个可行的解决方案。我还没找到

用例:将数组转换为这样的格式:在PDO insert语句中,数组键是列,数组值是SQL值。如果此请求与其他请求重复,我道歉。我还没有找到一个适合我的。在我的示例中,父数组是
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
                        (
                        )

                )

        )

)