PHP Conference Japan 2024

pg_convert

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_convert 將關聯式陣列值轉換成適用於 SQL 陳述式的格式

說明

pg_convert(
    PgSql\Connection $connection,
    字串 $table_name,
    陣列 $values,
    整數 $flags = 0
): 陣列|false

pg_convert() 會檢查 values 中的值,並將其轉換為適用於 SQL 陳述式的值。 pg_convert() 的前提條件是存在一個表格 table_name,該表格的欄位數量至少與 values 的元素數量相同。table_name 中的欄位名稱必須與 values 中的索引相符,且對應的資料類型必須相容。成功時返回包含已轉換值的陣列,否則返回 false

備註:

接受布林值並將其轉換為 PostgreSQL 布林值。也支援布林值的字串表示形式。null 會被轉換為 PostgreSQL NULL。

參數

connection

一個 PgSql\Connection 實例。

table_name

要根據其轉換類型的表格名稱。

values

要轉換的資料。

flags

可以組合使用任意數量的 PGSQL_CONV_IGNORE_DEFAULTPGSQL_CONV_FORCE_NULLPGSQL_CONV_IGNORE_NOT_NULL

傳回值

已轉換值的 陣列,如果失敗則返回 false

錯誤/例外

當欄位的值或類型與 PostgreSQL 的類型不相符時,會擲出 ValueErrorTypeError

更新日誌

版本 說明
8.3.0 現在,當欄位的值或類型與 PostgreSQL 的類型不相符時,會擲出 ValueErrorTypeError 錯誤;先前會發出 E_WARNING
8.1.0 connection 參數現在需要一個 PgSql\Connection 實例;先前需要一個 資源

範例

範例 #1 pg_convert() 範例

<?php
$dbconn
= pg_connect('dbname=foo');

$tmp = array(
'author' => 'Joe Thackery',
'year' => 2005,
'title' => 'My Life, by Joe Thackery'
);

$vals = pg_convert($dbconn, 'authors', $tmp);
?>

參見

新增註記

使用者貢獻的註記 5 則註記

2
匿名
20 年前
我看到的選項只有

PGSQL_CONV_IGNORE_DEFAULT - 不要使用預設值,方法是從返回的陣列中移除欄位
PGSQL_CONV_FORCE_NULL - 如果字串是空字串,則轉換為 NULL
PGSQL_CONV_IGNORE_NOT_NULL - 忽略 NOT NULL 限制

這些是常數,所以不要用引號括起來或做任何其他處理。
0
gorhas at gmail dot com
10 年前
使用 interval 時會出現問題。
如果在陣列中
"time_pause" => '00:30:00'
且 time_pause 是一個 interval
則插入會失敗
pg_insert(): '00:30:00' 與 '^(@?[ \t]+)?((([-+]?[ \t]+)?[0-9]+(\.[0-9]*)?[ ... 不符
0
dharana at dharana dot net
21 年前
我找到了 "options" 的可能值

PG_CONV_CHECK - 僅檢查
PG_CONV_STRICT - 對於非致命錯誤發出警告
PG_CONV_QUOTE - 為 vchar、text、datetime 的值加上引號。
PG_CONV_SLASH - 需要時加上反斜線。
PG_CONV_NULLCHK - 檢查 NOT NULL 欄位的值是否已定義。
PG_CONV_NO_DEFAULT - 即使值是空字串也忽略預設值。
-1
VLroyrenn
6 年前
另一個沒有完整說明的是(截至 PHP 7.0/7.1),pg_convert 不喜歡非純量類型,如果您傳遞任何非字串或數字的類型,包括陣列或 DateTime 之類的東西,它都會失敗(但不會拋出錯誤,只會發出 E_WARNING 並返回 false)。如果您想插入這些類型,您實際上必須自己轉換它們。

此外,有點令人驚訝的是,$table_name 與 pg_​escape_​identifier 的輸出不相容,或者似乎與任何其他類型的跳脫字元不相容。
-1
Hayley Watson
7 年前
這只會套用適當的跳脫字元和其他適合將 PHP 值嵌入 SQL 陳述式的處理。

當欄位標記為 NOT NULL 時,它(預設情況下)會檢查是否為 null,並且會抱怨嘗試為整數欄位轉換字串(浮點數將會被截斷)。

然而,除了最基本的語法檢查之外,它並不會驗證給定的值是否是欄位類型的合法值。

<?php
// 假設 smallints.smallint 是一個 smallint (-32768..32767) 類型欄位
foreach([-1234,
1234,
0,
32767,
-
32768,
32768, // smallint 類型的無效值
45.8, // 將被截斷為 45
400000, // smallint 類型的無效值
] as $smallint)
{
$tmp = ['smallint' => $smallint];
$vals = pg_convert($dbconn, 'smallints', ['smallint' => $smallint]);
echo
$vals['"smallint"'],"\n"; // 注意欄位名稱也會被轉換成 SQL 安全的格式
}

// 假設 uuids.uuid 是一個 UUID 類型欄位
foreach(['a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11',
'a0eebc999c0b4ef8bb6d6bb9bd380a11',
'{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}',
'Invalid Not-a-UUID', // 無效的非 UUID 值
'{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}',
'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11',
] as
$uuid)
{
$tmp = ['uuid' => $uuid];
$vals = pg_convert($dbconn, 'uuids', ['uuid' => $uuid]);
echo
$vals['"uuid"'],"\n";
}

?>

以上所有資料值都會被「轉換」,即使是無效的值,也不會出現錯誤訊息。
To Top