繁体   English   中英

mysqli准备语句查询错误在哪里?

[英]Where is the mysqli prepared statement query error?

我试图创建一个mysqli准备好的语句,从odbc连接的数据库中将表导入到mysql数据库中,使用106列宽表查询时遇到此错误。

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

当我在这里回显查询时...

插入 ? (ID,column1,column2,column3,column4,... 106总列...)值(?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

$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();
}  

我已经使用标准bind_param以及call_user_func_array()方法尝试了此操作。 我试过引用我的参数字符串和列名,但没有效果。 如果我的bind_param类型出错,我应该在prepare语句上没有错误吗? 但是SQL无法解决prepare命令的问题。 请帮忙!

查询参数可以在原地标量值使用。 您无法参数化表名称,列名称,SQL表达式,关键字,值列表等。

  • 错误: SELECT ?, b, c FROM t WHERE a = 1 ORDER BY b ASC
    参数值将是文字值,而不是列名。

  • 错误:从中SELECT a, b, c FROM ? WHERE a = 1 ORDER BY b ASC SELECT a, b, c FROM ? WHERE a = 1 ORDER BY b ASC
    语法错误。

  • 错误: SELECT a, b, c FROM t WHERE ? = 1 ORDER BY b ASC SELECT a, b, c FROM t WHERE ? = 1 ORDER BY b ASC
    参数值将是文字值,而不是列名。

  • 错误: SELECT a, b, c FROM t WHERE a IN (?) ORDER BY b ASC顺序SELECT a, b, c FROM t WHERE a IN (?) ORDER BY b ASC
    即使您传递以逗号分隔的字符串,参数值也将是单个文字值,而不是值列表。

  • 错误: SELECT a, b, c FROM t WHERE a = 1 ORDER BY ? ASC SELECT a, b, c FROM t WHERE a = 1 ORDER BY ? ASC
    参数值将是文字值,而不是列名。

  • 错误: SELECT a, b, c FROM t WHERE a = 1 ORDER BY b ?
    语法错误。

基本上,如果您可以写一个字符串文字,日期文字或数字文字来代替查询参数,那应该没问题。 否则, prepare()动态内容之前,必须将其插入到SQL字符串中。

似乎bind_param()函数不会替换第一个“?” 定义表名。 请尝试先手动将表格名称放入准备好的字符串中,然后仅使用'?' 期望值的标记。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM