Php mysqli prepared语句查询错误在哪里?

Php mysqli prepared语句查询错误在哪里?,php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,我试图创建一个mysqli prepared语句,将表从odbc连接的数据库导入mysql数据库,在106列范围的表查询中出现了这个错误 您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在'附近?(ID,第1列,第2列,第3列,第4列,'在第1行' 当我在这里回显查询时,它是 插入到?(ID,第1列,第2列,第3列,第4列,…106个总列…)值(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?

我试图创建一个mysqli prepared语句,将表从odbc连接的数据库导入mysql数据库,在106列范围的表查询中出现了这个错误

您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在'附近?(ID,第1列,第2列,第3列,第4列,'在第1行'

当我在这里回显查询时,它是

插入到?(ID,第1列,第2列,第3列,第4列,…106个总列…)值(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)

$sql=“从$table中选择*,其中$key='$acct';
$link=getODBCConnection();
$result=odbc_-do($link,$sql);
$data=array();
而($row=odbc_fetch_数组($result)){
//将所有查询行存储为数组
数组_push($data,$row);
}   
//插入到同名的mysql表中
//从第一行获取列计数
$columns=计数($data[0]);
$params=str_repeat(“?,”,$columns);
$params=rtrim($params,,');
$types=str_repeat(“s”,$columns+1);
$fields=内爆(“,”,数组_键($data[0]);
$sql=“在重复密钥更新时插入($fields)值($params)”;
echo$sql。“
”; $link=getSalesConnection(); $stmt=$link->prepare($sql); 变量转储($link->error); foreach($行数据){ $stmt->bind_param($types,$table,内爆(“,”,数组_值($row)); $stmt->execute(); }

我已经使用标准的bind_参数和call_user_func_array()尝试了这个方法方法。我已尝试引用我的参数字符串和列名,但没有效果。如果我的bind_-param类型有错误,我不应该在prepare语句中出现错误,是吗?但是进入prepare命令的SQL有一些问题,我无法确定。请帮助!

看起来bind_-param()函数不替换定义表名的第一个“?”。请尝试先手动将表名放入准备好的字符串中,并仅在需要值的位置使用“?”标记。

查询参数只能用于代替标量值。不能参数化表名、列名、SQL表达式、关键字和列表价值观等

  • 错误:
    从t中选择?、b、c,其中a=1由b ASC下单

    参数值将是文字值,而不是列的名称

  • 错误:
    从?中选择a、b、c,其中a=1由b ASC订购

    语法错误

  • 错误:
    从t中选择a、b、c,其中?=1由b ASC订购

    参数值将是文字值,而不是列的名称

  • 错误:
    从t中选择a、b、c,其中a按b ASC的(?)顺序
    参数值将是单个文字值,而不是值列表,即使传递逗号分隔的值字符串也是如此

  • 错误:
    从t中选择a、b、c,其中a=1按ASC下单

    参数值将是文字值,而不是列的名称

  • 错误:
    从t中选择a、b、c,其中a=1按b排序?

    语法错误

基本上,如果您可以编写一个字符串文字、日期文字或数字文字来代替查询参数,则应该可以。否则,您必须在准备SQL字符串之前将动态内容插入SQL字符串中

$sql = "SELECT * FROM $table WHERE $key = '$acct'";
$link = getODBCConnection();
$result = odbc_do($link, $sql);
$data = array();
while ($row = odbc_fetch_array($result)) { 
        //store all query rows as array
        array_push($data, $row);
}   
//insert into mysql table of the same name
//get column count from first row
$columns = count($data[0]);
$params = str_repeat(" ?,",$columns);
$params = rtrim($params,',');
$types = str_repeat("s",$columns+1);
$fields = implode(", ", array_keys($data[0]));
$sql = "INSERT INTO ? ($fields) VALUES ($params) ON DUPLICATE KEY UPDATE";
echo $sql."<br>";
$link = getSalesConnection();
$stmt = $link->prepare($sql);
var_dump($link->error);
foreach ($data as $row) {
        $stmt->bind_param($types, $table, implode(", ",array_values($row)));
        $stmt->execute();
}