使用php进行Visual foxpro DBF更新

时间:2010-06-04 23:41:06

标签: sql sql-update dbf visual-foxpro

我使用php使用ADO COM更新VFP 9.0下的某些表。

我可以选择并更新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设置还是阻止更新的其他东西,或者选择性地进行选择。

1 个答案:

答案 0 :(得分:0)

您使用的标准SQL样式语句很容易与VFP兼容。就像你的样本一样简单,我会先尝试一点改动。而不是使用escape“,只需在样本周围使用单引号,例如

UPDATE TABLE1设置COL1 ='AA',COL2 ='更新值',其中ID = 1

看看是否有任何作用。一旦它工作,我会转向参数化查询以确保安全......特别是在基于网络的情况下。 VFP不能像其他一些数据库那样使用“命名占位符”,而是使用“?”来处理基于ordinal的占位符应该应用你的“价值”......比如

UPDATE TABLE1 set col1 = ?, col2 =?其中id =?

然后,在添加参数时,根据与?相同的顺序添加?占位

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

然后,你应该好好去。

抱歉,我无法专门解决PHP问题,因为这不是我直接熟悉的问题,但应该有助于指导您。