使用 ODBC + Access 时转义 SQL 查询中的输入数据
Posted
技术标签:
【中文标题】使用 ODBC + Access 时转义 SQL 查询中的输入数据【英文标题】:Escape input data in SQL queries when using ODBC + Access 【发布时间】:2010-10-22 11:19:50 【问题描述】:我尝试odbc_prepare()
+ odbc_execute()
更新 Access 文件中的记录,但我总是收到关于列数不正确的SQL state 07001
错误消息(实际上,该消息是西班牙文,并没有多大意义感觉):
<?php
$items = array();
$items[100] = 'Foo';
$items[200] = 'Bar';
$sql = 'UPDATE street
SET name=?
WHERE street_id=?';
$stmt = odbc_prepare($conection, $sql);
if( $stmt===FALSE )
die(odbc_errormsg());
foreach($items as $cod => $name)
if( !odbc_execute($stmt, array($name, $cod)) )
die(odbc_errormsg());
odbc_execute manual page 的用户 cmets 建议 Microsoft Access ODBC 驱动程序不支持参数化查询。但是,我还没有找到一个 odbc_* 函数来转义数据。
那么...如何转义输入数据?
【问题讨论】:
没有冒犯,但是访问??????扔掉它并使用适当的数据库。 @Spudley,您建议使用哪种数据格式使用浏览器将数据上传到 Oracle 驱动的网站? 您好,您能否澄清一下,您是在将数据加载到 Access 数据库,然后再将其加载到 Oracle 数据库吗? @MikeAinOz:我正在修复一个现有的 Access 文件(由客户提供),以便稍后加载到 Oracle 中。导入器旨在丢弃错误的数据,我不想重写它并让它猜测:我更喜欢自己猜测:) 无论如何,我认为这本身就是一个好问题,不是吗? 【参考方案1】:通常在 MS Access 中,您通过将参数放在括号中来识别参数
$sql = 'UPDATE street
SET name=[myname]
WHERE street_id=[mystreet]';
这将如何与 php 结合,我不知道。
【讨论】:
如何转义括号?UPDATE street SET name=[myname [1]] WHERE street_id=[123]
试试 $sql = `UPDATE street SET name=['.myname[1].'] WHERE street_id=' etc...原谅我生锈的 PHP concat
别担心 PHP(我假设如果有一个函数可以逃脱,到目前为止有人会指出)。什么是纯 SQL 查询?
@Mike - 单引号不允许 SQL 注入吗?
MS Access 的部分问题是通过代码传递参数的文档没有很好地记录。因此,每个编写说明的人都只编写了 MS Access 要求用户即时输入的样式说明,而不是通过代码传递它们。多年来,我虽然这样做的唯一方法是动态构建 SQL 并提交(当然让你自己敞开心扉),但后来我发现了这个技巧 - ***.com/questions/95277/…【参考方案2】:
我一直在尝试随机的东西。如果您使用其中一种语法(或者甚至混合使用它们),odbc_prepare()
似乎会检测到参数:
INSERT INTO foo (bar) VALUES (:param)
INSERT INTO foo (bar) VALUES ([param])
但是,odbc_execute()
会抱怨缺少参数,无论您使用什么输入(数字数组、关联数组...)。它会知道无法找到的参数的确切数量。这使得整个机制完全没有意义。
遗憾的是,到目前为止我最好的解决方案是:
/**
* Escape a string to be inserted into Access via ODBC
*/
function odbc_escape_string_access($value)
$replacements= array(
"'" => "''",
);
return strtr($value, $replacements);
这太可怕了,但我找不到更好的。
【讨论】:
以上是关于使用 ODBC + Access 时转义 SQL 查询中的输入数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 Access SQL 函数时,Microsoft Access ODBC 驱动程序导致访问冲突
使用 ODBC 连接时如何在 MS Access 或 SQL Server 中使用日期数据类型
转义引号以使用 ODBC 在 R Markdown 中提交 sql