簡體   English   中英

MariaDB 和 PHP 准備好的語句的幾何字段問題

[英]Geometry field issue with MariaDB and PHP prepared statement

從 PHP 腳本中,使用 mysqli 准備好的語句插入一行,我在 POINT 類型的字段上收到從 MariaDB 返回的錯誤。 代碼看起來像這樣:

$sql = 'INSERT INTO reports (location) VALUES (?)';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $variable);
$variable = 'POINT(10,10)';
$stmt->execute();

location旨在存儲 GPS 坐標,並在其列定義中定義為數據類型。 在生成的 stmt object 中返回的錯誤有errno = 1416 錯誤 = 無法從您發送到 GEOMETRY 字段的數據中獲取幾何 object。

varchar 類型的其他列可以正常工作,所以我猜它在基礎表定義中的某處是POINT數據類型,並且在准備好的語句中將預期數據POINT (10, 10)表示為字符串類型。 我最初考慮將 lat、lon 存儲為單獨的 DECIMAL 列,但 POINT 數據類型可能會更好地服務於未來的目的。

在 MariaDB 監視器中,聲明:

INSERT INTO reports (location) VALUES (POINT(10,10));

將正常工作並將行插入數據庫表中。

另外,如果我要使用mysqli_query (我不打算使用),如下所示;

$variable = 'POINT(20, 20)';
$sql = "INSERT INTO reports (location) VALUES ($variable)";
mysqli_query($mysqli, $sql) 

它按預期工作。

所以,我的查詢是如何在 PHP 中,通過 mysqli 准備語句復制工作 MariaDB 監控語句或 mysqli_query() 示例。

POINT不是字符串,它是 SQL function。 MariaDB 不夠聰明,無法將字符串轉換為 SQL,因此無法將其綁定為字符串。 您可以綁定POINT的參數,但不能綁定 SQL 本身。

以下應該可以正常工作:

$sql = 'INSERT INTO reports (location) VALUES (POINT(?,?))';
$stmt = $mysqli->prepare($sql);
$stmt->execute([10,10]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM