我看到的選項只有
PGSQL_CONV_IGNORE_DEFAULT - 不要使用預設值,方法是從返回的陣列中移除欄位
PGSQL_CONV_FORCE_NULL - 如果字串是空字串,則轉換為 NULL
PGSQL_CONV_IGNORE_NOT_NULL - 忽略 NOT NULL 限制
這些是常數,所以不要用引號括起來或做任何其他處理。
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
pg_convert — 將關聯式陣列值轉換成適用於 SQL 陳述式的格式
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_DEFAULT
、PGSQL_CONV_FORCE_NULL
或 PGSQL_CONV_IGNORE_NOT_NULL
。
當欄位的值或類型與 PostgreSQL 的類型不相符時,會擲出 ValueError 或 TypeError。
版本 | 說明 |
---|---|
8.3.0 | 現在,當欄位的值或類型與 PostgreSQL 的類型不相符時,會擲出 ValueError 或 TypeError 錯誤;先前會發出 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);
?>
我看到的選項只有
PGSQL_CONV_IGNORE_DEFAULT - 不要使用預設值,方法是從返回的陣列中移除欄位
PGSQL_CONV_FORCE_NULL - 如果字串是空字串,則轉換為 NULL
PGSQL_CONV_IGNORE_NOT_NULL - 忽略 NOT NULL 限制
這些是常數,所以不要用引號括起來或做任何其他處理。
使用 interval 時會出現問題。
如果在陣列中
"time_pause" => '00:30:00'
且 time_pause 是一個 interval
則插入會失敗
pg_insert(): '00:30:00' 與 '^(@?[ \t]+)?((([-+]?[ \t]+)?[0-9]+(\.[0-9]*)?[ ... 不符
我找到了 "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 - 即使值是空字串也忽略預設值。
另一個沒有完整說明的是(截至 PHP 7.0/7.1),pg_convert 不喜歡非純量類型,如果您傳遞任何非字串或數字的類型,包括陣列或 DateTime 之類的東西,它都會失敗(但不會拋出錯誤,只會發出 E_WARNING 並返回 false)。如果您想插入這些類型,您實際上必須自己轉換它們。
此外,有點令人驚訝的是,$table_name 與 pg_escape_identifier 的輸出不相容,或者似乎與任何其他類型的跳脫字元不相容。
這只會套用適當的跳脫字元和其他適合將 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";
}
?>
以上所有資料值都會被「轉換」,即使是無效的值,也不會出現錯誤訊息。