Обновление Visual FoxPro DBF с использованием php

Я использую php для обновления некоторых таблиц в VFP 9.0 с помощью ADO COM.

Я могу выбирать и обновлять DBF до тех пор, пока не укажу любое предложение Where.
В тот момент, когда я добавляю предложение where в запрос, он просто возвращает или обновляет 0 строк.

$conn = new COM("ADODB.Connection");
$conn->Open('Provider=VFPOLEDB.1;Data Source="C:\\testDB.dbc";'); 

$query = "UPDATE TABLE1 set COL1 = \"AA\", COL2 = \"Updated value\" ";
$conn->Execute($query);

$query = "SELECT * FROM TABLE1 ";
$rs = $conn->Execute($query) or die("Error in query: $query. " . $conn->ErrorMsg());
while (!$rs->EOF) {
    echo " Got COL1: " . $rs->Fields("COL1") . " :: COL2: " . $rs->Fields("COL2") . " id: " . $rs->Fields("ID") . "\n";
    $rs->MoveNext();
}

Результат:

 Got COL1: AA :: COL2: Updated value                  id: 0
 Got COL1: AA :: COL2: Updated value                  id: 1
 Got COL1: AA :: COL2: Updated value                  id: 2

Код 2: с предложением Where

$query = "UPDATE TABLE1 set COL1 = \"BB\", COL2 = \"NEW2\" WHERE ID = 1";
$conn->Execute($query);
$query = "SELECT * FROM TABLE1 ";
$rs = $conn->Execute($query) or die("Error in query: $query. " . $conn->ErrorMsg());
while (!$rs->EOF) {
    echo " Got COL1: " . $rs->Fields("COL1") . " :: COL2: " . $rs->Fields("COL2") . " id: " . $rs->Fields("ID") . "\n";
    $rs->MoveNext();
}

Результат:

 Got COL1: AA :: COL2: Updated value                  id: 0
 Got COL1: AA :: COL2: Updated value                  id: 1
 Got COL1: AA :: COL2: Updated value                  id: 2

Столбец ID является ключевым в приведенной выше таблице.

Я относительно новичок в VFP. Я не уверен, является ли это настройкой Visual Foxpro или чем-то еще, что предотвращает обновления или выбор, если они выполняются выборочно.


person mtanish    schedule 04.06.2010    source источник


Ответы (1)


Стандартные операторы в стиле SQL, которые вы используете, легко совместимы с VFP. Каким бы простым ни был ваш образец, я бы сначала попробовал одно небольшое изменение. Вместо использования escape ", просто используйте одинарные кавычки вокруг вашего образца, например

UPDATE TABLE1 устанавливает COL1 = 'AA', COL2 = 'Обновленное значение', где ID = 1

Посмотрим, поможет ли это. Как только это сработает, я перейду к параметризованным запросам для безопасности... особенно в Интернете. VFP работает не с «именованными заполнителями», как в некоторых других базах данных, а с порядковыми заполнителями с использованием символа «?» где ваша "ценность" должна быть применена... например

ОБНОВЛЕНИЕ TABLE1 установить col1 = ?, col2 = ? где идентификатор = ?

Затем при добавлении параметров добавляйте на основе той же последовательности, что и ? заполнители

YourAdo.Parameters.Add( "ForColumn1", variableForColumn1 );
YourAdo.Parameters.Add( "ForColumn2", variableForColumn2 );
YourAdo.Parameters.Add( "IDKeyColumn", variableForID );

Тогда вы должны быть готовы идти.

Извините, я не могу помочь конкретно с PHP, так как я не знаком с ним напрямую, но должен помочь вам в этом.

person DRapp    schedule 07.06.2010
comment
Это не проблема с кавычками как таковыми, поскольку запрос без предложения WHERE работает нормально. Но все равно спасибо. Кто-то предложил мне использовать Cast в качестве обходного пути [где cast(ID as I) = 1], и это, кажется, отлично работает для меня. - person mtanish; 14.06.2010