【发布时间】:2014-03-18 23:18:03
【问题描述】:
您好,提前感谢您的帮助。
当我将查询完整地粘贴到 phpMyAdmin 中时,我得到了结果集。当我尝试在 PHP 脚本中运行查询时,出现 PHP 错误。我认为问题在于我如何在代码的 MySQL 语句部分中转义单引号(撇号)。谁能推荐一种转义方法来用于这个冗长的复杂 MySQL 查询。
这是在 phpMyAdmin 中输入的部分 MySQL 代码(它可以正常工作)......
SET SESSION group_concat_max_len = 2000000;
SET @radius = .014;
select
cast(concat('{"type":"Feature","id":"',t2.TerrID,'","properties": {"name":"',t2.TerrName,'","density":',t2.TotalOpp2,',"color":"',t2.TerrClr,'"},','"geometry" :{"type":"MultiPolygon","coordinates":[', t2.tett2,']}},')as char) as tett
from(
select TerrName,
TerrID,
sum(TotalOpp) as TotalOpp2,
AgentsAssigned,
(sum(TotalOpp) - AgentsAssigned * 60) as density,
if((sum(TotalOpp) - AgentsAssigned * 60)<0,"red", if((sum(TotalOpp) - AgentsAssigned * 60)<60,"yellow","green")) as TerrClr,
group_concat(tett) as tett2
from(
SELECT
territories.territory_name as TerrName,
territories.territoryID as TerrID,
territories_meta.tm_color,
territories.territory_description,
territories.territory_state,
GROUP_CONCAT(distinct(territories_zips.tz_zip)SEPARATOR ', ' ) AS ZipCodes,
GROUP_CONCAT(distinct(concat(users.user_Fname,' ',users.user_Lname))SEPARATOR ', ') AS AgentName,
users.user_role,
round(sum(boundaries_meta.bm_opportunity)/Count(distinct(territories_assign.ta_repID))) AS TotalOpp,
Count(distinct(territories_assign.ta_repID)) AS AgentsAssigned,
group_concat(boundaries.boundary_geometry)as tett
FROM
territories
INNER JOIN territories_zips ON territories.territoryID = territories_zips.tz_terrID
INNER JOIN territories_assign ON territories.territoryID = territories_assign.ta_territoryID...
... ...
这是我尝试将这部分代码添加到运行数据库查询的 PHP 脚本的地方...
$places_zipopps_terr3 = $db->query('SET SESSION group_concat_max_len = 2000000;
SET @radius = .014;
select
cast(concat(\'{"type":"Feature","id":"\',t2.TerrID,\'","properties": {"name":"\',t2.TerrName,\'","density":\',t2.TotalOpp2,\',"color":"\',t2.TerrClr,\'"},\',\'"g eometry":{"type":"MultiPolygon","coordinates":[\', t2.tett2,\']}},\')as char) as tett
from(
select TerrName,
TerrID,
sum(TotalOpp) as TotalOpp2,
AgentsAssigned,
(sum(TotalOpp) - AgentsAssigned * 60) as density,
if((sum(TotalOpp) - AgentsAssigned * 60)<0,"red", if((sum(TotalOpp) - AgentsAssigned * 60)<60,"yellow","green")) as TerrClr,
group_concat(tett) as tett2
from(
SELECT
territories.territory_name as TerrName,
territories.territoryID as TerrID,
territories_meta.tm_color,
territories.territory_description,
territories.territory_state,
GROUP_CONCAT(distinct(territories_zips.tz_zip)SEPARATOR \', \' ) AS ZipCodes,
GROUP_CONCAT(distinct(concat(users.user_Fname,\' \',users.user_Lname))SEPARATOR \', \') AS AgentName,
users.user_role,
round(sum(boundaries_meta.bm_opportunity)/Count(distinct(territories_assign.ta_repID))) AS TotalOpp,
Count(distinct(territories_assign.ta_repID)) AS AgentsAssigned,
group_concat(boundaries.boundary_geometry)as tett
FROM
territories
INNER JOIN territories_zips ON territories.territoryID = territories_zips.tz_terrID
INNER JOIN territories_assign ON territories.territoryID = territories_assign.ta_territoryID...
.....
【问题讨论】:
-
为什么不在
.sql文本文件中包含这个巨大的东西,读入,然后发送出去? -
谢谢你。 .sql 文件的想法让我想到,为什么不使用存储过程。我们最初对 .sql 文件进行了快速实验,但遇到了一些格式问题,在进一步深入研究之前,我们想尝试一下 SP。无论如何,快速提问存储过程相对于文本文件的优缺点是什么?再次感谢您
-
存储过程是一种更正式的方式。如果你运行这个非常重要的次数,这可能是最好的方法,因为它会使查询是什么变得一目了然。另一方面,更改存储过程以对代码进行细微调整很烦人,因此对于几乎与运行一样频繁更改的内容,请不要费心。
-
谢谢@tadman,这很有道理。
-
为什么这被否决了?
标签: php mysql escaping mysql-real-escape-string