使用ODBC + Access时,在SQL查询中转义输入数据

时间:2010-10-22 11:19:50

标签: php windows ms-access odbc

我已尝试odbc_prepare() + odbc_execute()更新Access文件中的记录但我总是收到有关错误列数的SQL state 07001错误消息(实际上,消息是在Spanglish中并没有多大意义):

<?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处的用户评论表明Microsoft Access ODBC驱动程序不支持参数化查询。但是,我还没有找到odbc_ *函数来逃避数据。

那么......我怎样才能逃避输入数据呢?

2 个答案:

答案 0 :(得分:1)

通常在MS Access中,您可以通过将参数放在括号中来识别参数

$sql = 'UPDATE street
        SET name=[myname]
        WHERE street_id=[mystreet]';

如何与php进行网格化,我不知道。

答案 1 :(得分:1)

我一直在尝试随机的东西。如果您使用这些语法之一(或者您甚至混合它们),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);
}

这太可怕但我找不到更好的东西。