Выход из входных данных в запросах SQL при использовании ODBC + Access - PullRequest
2 голосов
/ 22 октября 2010

Я пытался 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: указывают на то, что драйверы Microsoft Access ODBC не поддерживают параметризованные запросы. Однако я не нашел функции odbc_ * для экранирования данных.

Итак ... Как мне избежать входных данных?

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Я пробовал случайные вещи. Кажется, что 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);
}

Это ужасно, но я не мог найти ничего лучше.

1 голос
/ 26 октября 2010

Обычно в MS Access вы определяете параметры, помещая их в скобки

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

Как это сработает с php, я не знаю.

...