【问题标题】:Debugging error 1064 in SQL in order to see what's failing on a long SQL statment调试 SQL 中的错误 1064,以查看长 SQL 语句的失败原因
【发布时间】:2020-12-07 02:29:54
【问题描述】:

嗯,我正在运行一个非常大的 SQL 命令。我收到错误 1064(语法错误或访问冲突)。

有什么办法可以得到准备好的语句,看看哪里有问题?我只看到了 50 个字符,老实说,我不知道可能是什么错误。

这就是我创建和准备语句的方式:

function insertIntoMultiple($tablename, $columns, $data, $datetime_column_name = 'created_at') {
    global $db;
    
    $data = json_decode(base64_decode($data), true);
    $exp = explode(", ", $columns);
    $params = array_diff($exp, ["created_at"]);
    $real_columns = join(",", $params);

    // $join = join(',', json_decode($columns, true));
    $query = "INSERT INTO $tablename ($real_columns, $datetime_column_name) ";
    $i = 0;
    $c = count($data);
    foreach ($data as $param) {
        $marks = getMarks($params);

        // $query = storeQuery("INSERT INTO $tablename ($join, $datetime_column_name) VALUES ($marks, NOW())");
        $query .= "VALUES ($marks, NOW())";
        $query .= $i < $c - 1 ? "," : ";";
        $query .= "\n";

        ++$i;
    }

    $stmt = $db->prepare($query);
    $pars = getParams($data, $params);

    $r = $stmt->execute($pars);

    return $r;
}

其中有 24 列和 1000 个值要插入。所以查询中有 24,000 个参数。

这些是我用来为查询创建字符串的方法:

function getMarks($params, $for_update = false) {
    $arr = array();
    foreach ($params as $param) {
        if($param == "created_at") continue;
        $arr[] = $for_update ? '$param = ?' : '?';
    }
    return join(',', $arr);
}

function getParams($params, $columns) {
    $arr = array();

    foreach ($params as $param) {
        foreach ($columns as $column) {
            if($column == "created_at") continue;
            $arr[] = $param[$column];
        }
    }

    return $arr;
}

由于某种原因,这不起作用,这是我得到的唯一输出:

致命错误:未捕获的 PDOException:SQLSTATE[42000]:语法 错误或访问冲突:1064 您的 SQL 语法有错误; 检查与您的 MariaDB 服务器版本相对应的手册 在 'VALUES 附近使用的正确语法 ('1','xxx','xxxx7010','','https://xxxx/xxx/5...' 在第 2 行 /root/project/php/api.php:126

如您所见,我无法使用这些独特的信息。

我已经看到了这个问题:

我做了以下代码将整个命令输出到一个字符串:

function pdo_debugStrParams($stmt) {
    ob_start();
    $stmt->debugDumpParams();
    $r = ob_get_contents();
    ob_end_clean();
    
    return $r;
}

这给了我相同的查询(带有标记),因为我认为这需要在 -&gt;execute() 方法之后调用,这给了我一个异常,所以我什么都看不到。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    而不是 $query = "INSERT INTO $tablename ($real_columns, $datetime_column_name) ";

    使用这个 $query = "INSERT INTO $tablename ($real_columns, $datetime_column_name) VALUES";

    并且还要替换这一行$query .= "VALUES ($marks, NOW())";

    $query .= "($marks, NOW())";

    【讨论】:

    • 是的,我没看到。谢谢!
    猜你喜欢
    • 2017-06-14
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多