2024 PHP Conference Japan

odbc_execute

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

odbc_execute執行準備好的陳述式 (Prepared Statement)

說明

odbc_execute(Odbc\Result $statement, 陣列 $params = []): 布林值

執行使用 odbc_prepare() 準備的陳述式。

參數

statement

來自 odbc_prepare() 的 ODBC 結果物件。

params

params 中的參數將依序替換準備好的陳述式中的佔位符號。此陣列的元素將透過呼叫此函式轉換為字串。

任何在 params 中以單引號開始和結束的參數,都會被視為要讀取的檔案名稱,並將其內容作為對應佔位符號的資料傳送到資料庫伺服器。

如果您想要儲存一個實際上以單引號開始和結束的字串,您必須在參數的開頭或結尾添加一個空格或其他非單引號字元,這樣可以避免參數被視為檔案名稱。如果這不可行,那麼您必須使用其他機制來儲存字串,例如使用 odbc_exec() 直接執行查詢。

返回值

成功時返回 true,失敗時返回 false

更新日誌

版本 說明
8.4.0 此函式現在返回一個 Odbc\Result 實例;之前返回的是 資源
8.0.0 未使用的 flags 參數已被移除。

範例

範例 #1 odbc_execute()odbc_prepare() 範例

在以下程式碼中,只有當 myproc 的所有三個參數都是 IN 參數時,$success 才會是 true

<?php
$a
= 1;
$b = 2;
$c = 3;
$stmt = odbc_prepare($conn, 'CALL myproc(?,?,?)');
$success = odbc_execute($stmt, array($a, $b, $c));
?>

如果您需要使用 INOUT 或 OUT 參數呼叫預存程序,建議的解決方法是使用您的資料庫的原生擴充功能(例如,Oracle 的 oci8)。

參見

新增註釋

使用者貢獻的註釋 17 則註釋

tcmleung at yahoo dot com
23 年前
odbc 有一個最大緩衝區大小,這表示它每次只會從資料庫儲存和檢索有限大小的資料。最大緩衝區大小為 4096,並在 php.ini (odbc.defaultlrl) 中設定。您可以將其設定為更高的值以存取更大的資料。
a dot brock at hhv-rheinklang dot de
18 年前
我有一個解決方案,可以解決字串因為單引號而被解釋為檔案名的問題

只需在字串末尾添加一個空格

<?php
function odbc_escape_params ($params) {
if (!
is_array($params) or empty($params)) {
return array();
}
foreach (
$params as $key=>$val) {
if (
strlen($val) > 1 and $val{0} == "'" and $val{strlen($val)-1} == "'") {
$params[$key] .= ' ';
}
}
return
$params;
}
?>
wntrmute at tampabay dot rr dot com
26 年前
Solid 的問題
Solid 將 CHAR、VARCHAR、LONG VARCHAR、BINARY、VARBINARY 和 LONG VARBINARY 的最大長度定義為 2G。但是,在建立用於 PHP 的表格時,如果您打算儲存非常大或很長的資料(例如:長度超過 64k 的資料,例如 GIF/JPG 或非常大的文字區域),則應為這些欄位選擇 LONG VARCHAR 或 LONG VARBINARY。
alvaro at demogracia dot com
12 年前
當 odbc_execute() 失敗時,它會返回 FALSE 並觸發警告,但它不一定會提供 odbc_error() 和 odbc_errormsg() 的資訊。
svemir_AT_baltok.com
22 年前
回覆 cpoirier 於 2001 年 3 月 4 日 03:30 的留言

目前,Access 2000 確實透過 ODBC 支援參數化查詢。它似乎仍然存在 Memo 和 OLE 欄位方面的問題,但「一般」類型可以正常運作。
sjericson at mindspring dot com
23 年前
我認為 odbc_prepare 和 odbc_execute 不支援 MSSQL 儲存程序的輸出參數。MSSQL 輸出參數的範例位於 http://support.microsoft.com/support/kb/articles/q174/2/23.asp

此外,我的 MSSQL 驅動程式似乎只在我使用以下咒語時才會正常運作

...程式碼已移除...
$stmt=odbc_prepare($conn_id, "exec my_proc_name ?,?,?");
$parms=array("fred","password",5);
if (!odbc_execute($stmt, &$parms)) die("odbc_execute 失敗");
dj at magma dot nz
5 年前
當使用 odbc_execute 連線到 MS Access 資料庫時,請使用單引號(而不是雙引號)來定義字串字面值。

例如:$sql = "Insert into [table] ([first], [last]) select 'Bob', 'Builder';"

如果您使用雙引號,可能會出現類似以下的錯誤:[Microsoft] [ODBC Text Driver] 參數太少。預期:2
jeroen at pyromanic dot nl
16 年前
如果您想透過 ODBC 使用 MSSQL 的儲存程序,請閱讀

http://www.sitepoint.com/article/php-microsoft-sql-server/2

它可以幫您節省很多時間 ;)
reaganpr at hotmail dot com
23 年前
在 Windows 下執行 4.0.6 的 CGI 版本時,我嘗試使用帶有參數陣列的 odbc_execute 呼叫 SQL Server 中的預存程序時,遇到了這個錯誤

致命錯誤:emalloc():無法配置 268675669 位元組

可怕的錯誤,對吧?在我的情況下,這僅僅意味著 SQL Server 找不到預存程序。完全是我的錯,但錯誤訊息卻相當含糊。

p.
cpoirier at shelluser dot net
23 年前
希望能以我的痛苦來幫助其他人:Microsoft Access ODBC 驅動程式不支援參數化查詢。
edrenth at thematec dot nl
24 年前
當與參數一起使用且語句失敗時,您將無法再使用不同的參數,將會使用與失敗語句相同的參數。
vince at dinapoliwest dot com
8 年前
我已經使用 odbc 函數很長一段時間了,當我最終讀到關於參數以單引號開始和結束時的處理方式的細節時,我感到震驚!我以為 odbc_execute 與 odbc_exec 的主要區別在於防止 SQL 注入,但顯然這個新增的功能實際上打開了另一個安全漏洞,也許更糟。這是我的修復方法

<?php

函式 odbc_execute_clean_parameters($result_id, $parameters_array){
for(
$i = 0; $i < count($parameters_array); ++$i){
if(
substr($parameters_array[$i], -1) == "'" && substr($parameters_array[$i], 0 ,1) == "'" ){
$parameters_array[$i].= " ";
}
}
return
odbc_execute($result_id, $parameters_array);
}

// 接著呼叫
$stmt = odbc_prepare($conn, " insert into mytable (col1, col2) values (?, ?) ");
$r = odbc_execute_clean_parameters($stmt, array( $val1, $val2 ) );

?>
traynor at uni hyphen hannover dot de
17 年前
Obdc_prepare 和 obdc_execute 只能在有限的情況下用作 odbc_exec 的替代方案

$con = obdc_connect ($dsn, $user, $pass);
$sql = "select * from TABLE";

$result = obdc_exec ($con, $sql); //這行可以用以下方式取代
//接著查看結果

odbc_result_all ($result);
odbc_free_result ($result);
odbc_close ($con);

只要 $sql 包含一個格式正確且完整的查詢,就能得到與中間一行相同的結果:

$result = odbc_prepare ($con, $sql);
odbc_execute ($result);

只要 $sql 包含格式良好且完整的查詢即可。

嘗試將其轉換為使用問號作為佔位符號的參數化查詢毫無意義,因為像這樣的程式碼只會導致錯誤訊息:

$sql = "select * from TABLE where needle = ?";
$result = odbc_prepare ($con, $sql);
for ($i = 0; $i < 4; $i++)
{
odbc_execute ($result, array ($i));
// 以及您想對結果執行的任何操作
// 但您只會得到「需要參數」或「計數不符」
}

缺乏此類函式的文件應該是一個警訊。
russell dot brown at removethis dot insignia dot com
20 年前
回覆 tcmleung at yahoo dot com (2001年11月9日),我想補充一個我發現的注意事項,那就是 odbc.defaultlrl/odbc_longreadlen() 值可能只適用於 odbc 到 php 的轉換,而不適用於 php 到 odbc(儘管這可能與資料庫有關)。因此,如果您想發佈二進位資料,4096 位元組的限制仍然有效。所以,使用上述帶引號的文件名上傳程序來發佈二進位資料,比使用 prepare... execute 方法並將資料保存在 php 變數中,更有機會成功。
mjs at beebo dot org
18 年前
不要忽略它說如果你的字串以單引號開頭和結尾,該字串會被解釋為檔名!

這意味著你不能這樣做:

$sth = odbc_prepare($dbh, "INSERT INTO people(name) VALUES(?)");
$res = odbc_execute($sth, array($name));

而不檢查 $name 的值——如果 $name 是,例如,'\\'c:\\passwords.txt\\'',c:\\passwords.txt 的內容就會作為「名稱」插入到你的資料庫中。

此外,儘管文件建議,但(令人難以置信的是)似乎沒有任何方法可以跳脫你的單引號(透過實驗,以及從閱讀原始碼):如果你的字串以單引號開頭和結尾,你就不能使用 odbc_execute 將其插入到資料庫中。
Marco Napetti
12 年前
使用準備好的 select 查詢的正確方法是:
<?PHP

$rConnection
= odbc_connect('AS400', 'QSECOFR', 'QSECOFR');
if(
$rConnection === false) {
throw new
ErrorException(odbc_errormsg());
}

$rResult = odbc_prepare($rConnection, 'SELECT * FROM KMNSH00F WHERE SHTMST > ?');
if(
$rResult === false) {
throw new
ErrorException(odbc_errormsg());
}

if(
odbc_execute($rResult, array('0001-01-01 00:00:00.000000')) === false) {
throw new
ErrorException(odbc_errormsg());
}

odbc_result_all($rResult);

odbc_free_result($rResult);

odbc_close($rConnection);

?>
匿名
15 年前
如果您在您的環境(SUSE Linux、Apache2、PHP5、FreeTDS、unixODBC)中無法使用 php_mssql 模組,另一種方法是使用 SQL Server 函數而不是預存程序。以下是我的範例程式碼。

<?php
$connect
= odbc_connect($myDB, $myUser, $myPass);

$query = "SELECT dbo.<函數名稱>(<欄位名稱>,<文字>) AS 別名";

// 執行查詢
$result = odbc_exec($connect, $query);

while(
odbc_fetch_row($result)) {
$Var1 = odbc_result($result, <欄位別名>);
//echo "Var1: " . $Var1 . "<br>";

// 加入其他邏輯

}
?>

一旦我弄清楚這一點,我的應用程式就完美地運作了。
To Top