[英]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.