Well, I am running a SQL command that is very large. I am getting error 1064 (Syntax error or access violation).
Is there any way to get the prepared statement, to see where the fault can be? I'm only seeing 50 characters and I honestly don't know what the bug could be.
This is how I create and prepare the statement:
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;
}
Where there are 24 columns and 1000 values to insert. So there is 24,000 parameters on the query.
These are the methods which I use in order to create the string for the query:
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;
}
For some reason, this isn't working and this is the unique output that I'm getting:
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'VALUES ('1','xxx','xxxx7010','','https://xxxx/xxx/5...' at line 2 in /root/project/php/api.php:126
As you can see I can't manage to make it to work with this unique information.
I already saw this question:
And I did the following code to output the entire command to a string:
function pdo_debugStrParams($stmt) {
ob_start();
$stmt->debugDumpParams();
$r = ob_get_contents();
ob_end_clean();
return $r;
}
Which gives me the same query (with the marks), because I suppose that this needs to be called after the ->execute()
method which is giving me an exception, so I can't see anything.