有什么方法可以用来发现PDO查询中的差异?

时间:2017-07-15 14:20:13

标签: php mysql arrays pdo

我有以下

  • 编码为JSON的多维数组。每个索引都包含80个密钥
  • 一个包含80个项目的CSV文件代表上述索引中相同的键,因为将它们转储到同一个脚本中会太麻烦

首先,我改变JSON数组中的原始键以使用下划线,因为命名占位符不接受

foreach ($content as $key => &$bulk) {

    $vals = array_values($bulk);

    $keys = array_map(function ($item) {

    $item = str_replace(' ', '_', $item);

    return ":$item"; // semi-colons are redundant but I tried it also to be on the safe side

    }, array_keys($bulk));

    $bulk = array_combine($keys, $vals);

    // add date to each fixture
    $bulk[':date'] = date('Y-m-d');
} 

然后我对CSV文件中的项目执行完全相同的操作,并将它们转换为可在实际查询中使用的内容

// swap out spaces
array_walk($validColumns, function (&$val) {

    $val = str_replace(' ', '_', $val);
});

// prepare named placeholders
$transform = array_map(function ($val) {

    return ":$val";
}, $validColumns);

$placeholders = implode(',', $transform);

$validColumns = array_map(function ($val) {

    return "`$val`";
}, $validColumns); 

在此之后,我使用以下字符串

构建查询
$query = 'INSERT INTO container (' . implode(',', $validColumns) . ") VALUES ($placeholders)";

并尝试使用此

执行
try {

    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $conn->beginTransaction();

    $transaction = $conn->prepare($query);

    foreach ($content as $key => $bulk) {

        if (!is_array($bulk)) $bulk = [$bulk];

        var_dump(array_diff($transform, array_keys($bulk))); // this returns an empty array even when I swap the arguments

        $transaction->execute($bulk);
    } 

但它不断抛出可怕的错误SQLSTATE[HY093]: Invalid parameter number: parameter was not defined'。我的问题是如何从array_diff中的嵌套foreach知道我错过了哪些键?

当我var_dump长度时,它们都返回80.与占位符值相同。我也尝试使用对象键而不添加分号,但问题仍然存在。

我是否可以使用任何其他工具来检测为什么它会根据不一致性无情地抛出错误 - 它是否找不到匹配的占位符或者是否存在比占位符更多的values ? 我已经将这个错误搜索到每个单独的SO线程到第16个搜索结果,并且每次有人发布他的查询和绑定参数但在我的情况下我有80个长度数组和80个长度隐藏复合词字符串表示键,这将是阻止任何人试图帮助的有效方法。

0 个答案:

没有答案