2024 PHP Conference Japan

odbc_exec

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_exec直接執行 SQL 陳述式

說明

odbc_exec(Odbc\Connection $odbc, 字串 $query): Odbc\Result|false

將 SQL 陳述式傳送到資料庫伺服器。

參數

odbc

ODBC 連線物件,詳情請見 odbc_connect()

query

SQL 陳述式。

返回值

如果 SQL 命令執行成功,則返回一個 ODBC 結果物件,否則返回 false

更新日誌

版本 說明
8.4.0 odbc 現在需要一個 Odbc\Connection 實例;先前需要一個 資源
8.4.0 此函數現在返回一個 Odbc\Result 實例;先前返回一個 資源
8.0.0 flags 已移除。

參見

新增筆記

使用者貢獻的筆記 19 則筆記

3
james @ php-for-beginners co uk
19 年前
大家好,我設法讓這小段程式碼運作,如果您要將長表單插入資料庫中,它非常有用。

if ( ! empty ( $_POST ) ){
array_pop($_POST);
foreach($_POST as $key => $val){
$columns .= addslashes($key) . ", ";
$values .= "'" . addslashes($val) . "', ";

}
$values = substr_replace($values, "", -2);
$columns = substr_replace($columns, "", -2);

$sql = "INSERT INTO table ($columns) VALUES ($values)";
echo $sql;
$results = odbc_exec($conn, $sql);
if ($results){
echo "查詢已執行";
}else {
echo "查詢失敗 " .odbc_error();
}
}

雖然不是世界上最安全的,但可以加快從大型表單收集資料的速度。
2
rupix at rediffmail dot com
21 年前
我嘗試了以下程式碼:

<?php
$odbc
=odbc_connect("pbk", "root","") or die(odbc_errormsg());
$q="insert into pbk values(\"$name\", \"$phone\")";
print
$q;
odbc_exec($odbc, $q) or die("<p>".odbc_errormsg());
?>

它無法運作。但是,如果我使用單引號而不是 \",則一切順利

因此以下程式碼可以運作

<?php
$odbc
=odbc_connect("pbk", "yourworstnightmare","abracadabra") or die(odbc_errormsg());
$q="insert into pbk values('$name', '$phone')";
print
$q;
odbc_exec($odbc, $q) or die("<p>".odbc_errormsg());
?>

在 Win2k 上使用使用者 DSN 並不可取。請務必使用系統 DSN。我還不清楚這樣做的影響。
1
gross at arkana dot de
25 年前
如果您在使用 PHP 3.0.11 的 NT/IIS 上運行,並且想使用帶有「預存程序」的 MS Access 資料庫,您可以發送如下 ODBC SQL 查詢:
<?php
$conn_id
= odbc_connect( "odbc_test_db", "", "", SQL_CUR_USE_DRIVER );
$qry_id = odbc_do( $conn_id, "{CALL MyQuery}" );
?>
這樣您就不需要在 php 檔案中整合像以下這樣的查詢字串:

SELECT * FROM TblObject WHERE (((TblObject.something) Like "blahblahblah"));

您可以直接呼叫由 MS Access 產生的查詢 "MyQuery"。
1
rmkim at uwaterloo dot ca
25 年前
對於 Win32(NT) 和 MSAccess 2000,無論您擷取哪種類型的日期欄位,PHP 都會自動將其轉換為「yyyy/mm/dd hh:mm:ss」格式,而不管您在 Access 中指定的日期樣式為何。
當您執行 SELECT、UPDATE 或 DELETE 查詢時,這似乎會造成問題,但奇怪的是,INSERT 卻可以正常運作。我嘗試將日期解析為所需的格式,但 PHP 仍然出現條件不符的錯誤。
1
mir eder
17 年前
如果您在 ODBC 查詢中遇到文字欄位被截斷的問題(例如在 4096 個字元處),請嘗試以下方法:

在 php.ini 中:
- odbc.defaultlrl = 65536

在您的 PHP 程式碼中,於查詢之前:
- ini_set ( 'odbc.defaultlrl' , '65536' );
1
das_yrch at hotmail dot com
21 年前
我嘗試用這種方式查看查詢結果,而且它有效!

$Conn = odbc_connect
("bbdd_usuaris","","",SQL_CUR_USE_ODBC );

$result=odbc_exec($Conn,"select nom from usuaris;");

while(odbc_fetch_row($result)){
for($i=1;$i<=odbc_num_fields($result);$i++){
echo "Result is ".odbc_result($result,$i);
}
}
0
test
7 年前
如果 eval() 是答案,那麼你幾乎肯定問錯了問題。
0
匿名
19 年前
以下這點對我來說有點違背直覺,所以我一直不斷踩坑。我只是想為其他可能也會踩坑的人留下一個筆記。

使用 `if (!odbc_exec("select MyValue from MyTable where Key1='x' and Key2='y'"))`

並不是檢查是否存在 Key1 = x 且 Key2 = y 的記錄的好方法。即使沒有任何記錄,`odbc_exec` 也總是會返回一個結果句柄。

相反地,您必須使用其中一個提取函數來確定記錄實際上不存在。這樣做應該可以:

`if (!($Selhand = odbc_exec("select MyValue from MyTable where Key1='x' and Key2='y'"))`
`|| !odbc_result($Selhand, 1))`
0
Sean Boulter
20 年前
如果 WHERE 子句指定的欄位中存在單引號,ODBC 會因為解析錯誤而失敗。雖然看起來很直觀,但在欄位周圍使用雙引號 (`"$var"`) 並不起作用。我找到的唯一解決方案是用兩個單引號替換欄位中的所有單引號。ODBC 將第一個單引號解釋為轉義字元,將第二個單引號解釋為字面量。感謝 http://www.devguru.com/features/knowledge_base/A100206.html 提供這個技巧。
0
miguel dot erill at doymer dot com
22 年前
在之前的貢獻中,有人提到如果您在 NT/IIS 上運行 PHP 3.0.11,則可以使用 MS Access 資料庫的「預存程序」。

這是對的,但如果這些預存程序有參數,您必須像這樣在命令列中提供它們:

`$conn_id = odbc_connect( "odbc_test_db", "","", SQL_CUR_USE_DRIVER );`
`$qry_id = odbc_do( $conn_id, "{CALL MyQuery(".$param.")}" );`
0
lee200082 at hotmail dot com
22 年前
補充前面關於方括號的說明:

用 `[` 和 `]` 將 SQL 欄位名稱括起來,也可以讓您在 SQL 查詢中使用 MS Access 保留字,例如 `date`、`field` 和 `time`……方括號似乎只是告訴 Access 忽略其中任何內容的其他含義,並將它們簡單地視為欄位名稱。
0
sk2xml at gmx dot net
23 年前
問題:SQL 陳述式中的欄位名稱有空格,而且 `[]` 無法使用!

解決方案:嘗試使用雙引號 `""` 代替。

例如:

`SELECT table2.first, table1.[last name] FROM tabel1, table2` -> 無法使用

`SELECT table2.first, table1."last name" FROM tabel1, table2` -> 嘗試這個

備註:別忘了跳脫字元!!!
0
akchu at at ualberta dot ca
23 年前
ODBC/MS Access 日期欄位

在 MS Access 的 SELECT 陳述式中比對日期需要使用以下格式:
`#Y-m-d H:i:s#`

例如:

`SELECT * FROM TableName WHERE Birthdate = #2001-01-07 00:00:00#`



`SELECT * FROM TableName WHERE Birthdate BETWEEN #2000-01-07 00:00:00# AND #2001-01-07 00:00:00#`

我花了很長時間才弄清楚這一點。
0
vpil at retico dot com
24 年前
`odbc_exec` 的其他連結
如何實際編寫 SQL 命令
http://www.roth.net/perl/odbc/faq/
http://www.netaxs.com/~joc/perl/article/SQL.html
解密 SQL
大型參考手冊
http://w3.one.net/~jhoffman/sqltut.htm
結構化查詢語言簡介
涵蓋資料的讀取、新增、修改和刪除。
-1
rob at vendorpromotions dot com
21 年前
在 DB2 中,預設會以「for update」開啟 select 語句。如果您使用的是 DB2,則必須在語句末尾加上「for read only」才能從 SYSCAT.TABLES 等系統表格中進行查詢,否則會觸發類似以下的錯誤:

警告:SQL 錯誤:[IBM][CLI 驅動程式][DB2/LINUX] SQL0151N 無法更新欄位 "MAXFREESPACESEARCH"。SQLSTATE=42808,SQL 狀態碼 42808 in SQLExecDirect

例如:

$query = odbc_exec($conn, "select * from syscat.tables for read only");
odbc_result_all($query);

這樣就可以正常運作(僅適用於 DB2)。我不確定其他資料庫的狀況。

這個 select 語句在 'db2' 命令列中可以正常執行,但在 PHP 中卻不行,這是因為這個副作用所導致的。
-2
delowing gmail dot com
18 年前
惡意程式碼很容易被注入到 SQL 語句中。這個函式會將參數用引號括起來,使其無法執行。您可以在自己的預存程序中根據需要將字串轉換為數值。

function sql_make_string($sin){
return "'".str_replace("'","''",$sin)."'";
}

// 這可能會刪除 MYTABLE 中的所有資料
$evil = "734'; DELETE FROM MYTABLE; print 'ha ha";
$sql = "SELECT * FROM MYTABLE WHERE mykey = '$evil'";
$rst = odbc_exec($connection,$sql);

// 這可能不會刪除資料。
$good = sql_make_string($evil);
$sql = "SELECT * FROM MYTABLE WHERE mykey =".$good
$rst = odbc_exec($connection,$sql);
-2
petercdow at gmail dot com
11 年前
使用雙引號 (") 而不是單引號 (') 來界定字串的 SQL 語句在 Access 中可以正常運作,但在 odbc_exec 中會失敗,並顯示以下錯誤訊息:

[Microsoft][ODBC Microsoft Access 驅動程式] 參數太少。預期為 6 個。

例如:

$q = "INSERT INTO TableA (Fld1, Fld2, Fld3) VALUES('A', 'B', 'C');"

在 Access 和 ODBC 中都可以正常運作,但

$q = 'INSERT INTO TableA (Fld1, Fld2, Fld3) VALUES("A", "B", "C");'

會失敗並顯示上述錯誤。
-3
fuadMD at gmail dot com
19 年前
<?php
// - This is a complete working dynamic example of using:
// odbc_connect, odbc_exec, getting col Names,
// odbc_fetch_row and no of rows. hope it helps
// - your driver should point to your MS access file

$conn = odbc_connect('MSAccessDriver','','');

$nrows=0;

if (
$conn)
{
$sql = "select * from $month";
//this function will execute the sql satament
$result=odbc_exec($conn, $sql);

echo
"<table align=\"center\" border=\"1\" borderColor=\"\" cellpadding=\"0\" cellspacing=\"0\">\n";
echo
"<tr> ";
// -- print field name
$colName = odbc_num_fields($result);
for (
$j=1; $j<= $colName; $j++)
{
echo
"<th align=\"left\" bgcolor=\"#CCCCCC\" > <font color=\"#990000\"> ";
echo
odbc_field_name ($result, $j );
echo
"</font> </th>";
}
$j=$j-1;
$c=0;
// end of field names
while(odbc_fetch_row($result)) // getting data
{
$c=$c+1;
if (
$c%2 == 0 )
echo
"<tr bgcolor=\"#d0d0d0\" >\n";
else
echo
"<tr bgcolor=\"#eeeeee\">\n";
for(
$i=1;$i<=odbc_num_fields($result);$i++)
{
echo
"<td>";
echo
odbc_result($result,$i);
echo
"</td>";
if (
$i%$j == 0 )
{
$nrows+=1; // counting no of rows
}
}
echo
"</tr>";
}

echo
"</td> </tr>\n";
echo
"</table >\n";
// --end of table
if ($nrows==0) echo "<br/><center> Nothing for $month yet! Try back later</center> <br/>";
else echo
"<br/><center> Total Records: $nrows </center> <br/>";
odbc_close ($conn);

}
else echo
"odbc not connected <br>";
?>
-4
phobo at at at paradise dot net dot nz
24 年前
如果 Openlink 連線到 MS Access 資料庫失敗並顯示「驅動程式無效」錯誤或「沒有可用的 tuples」警告,請在使用 odbc_connect() 時使用 SQL_CUR_USE_ODBC 游標…

Siggy
To Top