使用 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

使用 ODBC 转义包含问号的访问表名称

ODBC 查询在 MS Access 中有效,但在 SQL Server 中超时

MS Access VBA 和 SQL Server - 记录集更新时 ODBC 调用失败