调试 SQL 中的错误 1064,以查看长 SQL 语句的失败原因

嗯,我正在运行一个非常大的 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...' 附近使用的正确语法,网址为/root/project/php/api.php:126 中的第 2 行


正如你所看到的,我无法让它使用这个独特的信息。


这给了我相同的查询(带有标记),因为我认为这需要在给我一个异常的方法之后调用->execute(),所以我看不到任何东西。


吃鸡游戏
浏览 57回答 1
1回答

牧羊人nacy

代替&nbsp;$query = "INSERT INTO $tablename ($real_columns, $datetime_column_name) ";用这个&nbsp;$query = "INSERT INTO $tablename ($real_columns, $datetime_column_name) VALUES";并且也替换这条线$query .= "VALUES ($marks, NOW())";和$query .= "($marks, NOW())";
打开App,查看更多内容
随时随地看视频慕课网APP