mysql - Laravel Lumen:使用插入执行 mysql 函数
问题描述
我希望在查询中执行自定义MySQL 函数,以便更新(或插入)数据库中的值。
我的实际代码(带有自定义查询):
DB::statement('INSERT INTO locations(longitude, latitude, altitude, speed, point, user_id, circle)
VALUES (' . $long . ', ' . $lat . ', ' . $alt . ', ' . $speed . ', ' . $point . ', GETPOLYGON(' . $lat . ', ' . $long . ' , 0.300, 12))
ON DUPLICATE KEY UPDATE longitude=' . $long . ',latitude=' . $lat . ',altitude=' . $alt . ',speed=' . $speed . ',point=' . $point . ',circle=GETPOLYGON(' . $lat . ', ' . $long . ' , 0.300, 12)');
我真的不知道这样的执行是否是我的最佳方式。
我的自定义函数是“getpolygon”。但这似乎不起作用
[2020-04-17 08:23:01] local.ERROR: PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '43.325178, GETPOLYGON(43.325178, 1.121354 , 0.300, 12))
我在 SQL 中的函数:
CREATE FUNCTION getpolygon(lat DOUBLE, lon DOUBLE, radius SMALLINT, corner TINYINT) RETURNS geometry DETERMINISTIC BEGIN DECLARE i TINYINT DEFAULT 1; DECLARE a, b, c DOUBLE; DECLARE res TEXT; IF corner < 3 || radius > 500 THEN RETURN NULL; END IF; SET res = CONCAT(lat + radius / 111.12, ' ', lon, ','); WHILE i < corner do SET c = RADIANS(360 / corner * i); SET a = lat + COS(c) * radius / 111.12; SET b = lon + SIN(c) * radius / (COS(RADIANS(lat + COS(c) * radius / 111.12 / 111.12)) * 111.12); SET res = CONCAT(res, a, ' ', b, ','); SET i = i + 1; END WHILE; RETURN GEOMFROMTEXT(CONCAT('POLYGON((', res, lat + radius / 111.12, ' ', lon, '))')); END;
谢谢
解决方案
正如问题中所评论的那样,这里有一些错误。
- 您的函数
radius
应为SMALLINT
,但您将浮点值传递给它。 - 您缺少
user_id
值,因此实际代码将函数的输出getpolygon()
放入user_id
列,而没有放入circle
列,从而导致语法错误。 - 您的代码可能容易受到 SQL 注入的攻击。我说可能是因为我不知道您在查询中连接的变量的来源。
因此,要修复 SQL 注入,您可以使用准备好的语句DB::statement($query, $bindings)
(请参阅API Docs):
DB::statement(
'INSERT INTO locations(longitude, latitude, altitude, speed, point, user_id, circle)
VALUES (?, ?, ?, ?, ?, ?, GETPOLYGON(?,?, 0.300, 12))
ON DUPLICATE KEY UPDATE longitude=?,latitude=?,altitude=?,speed=?,point=?,user_id=?,circle=GETPOLYGON(?,?, 0.300, 12)',
[
$long, $lat, $alt, $speed, $point, $user_id, $lat, $long,
$long, $lat, $alt, $speed, $point, $user_id, $lat, $long,
]
);
请注意,参数被添加两次,因为您需要绑定到插入和更新语句。
推荐阅读
- oracle - 无法使用的分区 Oracle / datastage
- python - 使用 pandas 将输出写入另一个文件
- c++ - 如何对齐 QTextEdit 文本
- angularjs - 分页不保持页面导航之间的页面状态
- c# - 在注销剃须刀页面上禁用获取请求
- openssl - i2d_ASN1_OBJECT 问题
- server - ns3 脚本的输出,其中 evalvid 服务器通过 802.11 向客户端发送数据包
- sql - 仅显示周一至周日整周的数据顺序并隐藏非整周数据
- html - 有什么区别
和 我是学习者,我想知道什么是 diff b/w ionic 和 HTML 标签,哪些标签适用于混合移动开发应用程序,有人可以建议我下面的两个代码在我的移动应用程序中运行良好,但哪些标签是最可取的?
<div class="list"> <div class="item it
- windows-10 - 本机 Wifi API:使用受限通道集执行 WlanScan