为什么我不能将查询结果插入到临时表中,但如果我从CREATE TEMPORARY TABLE语句中删除TEMPORARY并创建一个实际的表,我的查询就会完美运行。
逻辑会让我相信db会话正在丢失并且临时表正在被删除,但是当我在脚本中测试各种位置时,临时表似乎存在,无论出于何种原因,数据都没有被插入临时表,但它会插入普通表。
创建表格查询:
$ttbldrop = $db->prepare("DROP TABLE IF EXISTS z123");
$ttbldrop->execute();
$stmt = $db->prepare("CREATE TEMPORARY TABLE z123 (zcity varchar(32), zstate varchar(32), zip_code varchar(5), latitude DECIMAL(9,6), longitude DECIMAL(9,6), miles DECIMAL(4,1))");
$temptbl = $stmt->execute();
if(!$temptbl) {
echo "Temp Table Not Created";
die;
}else{
//echo "Temp Table Created Successfully";
创建功能:
function radiusContent() {
include 'conn.php';
global $latN;
global $latS;
global $lonE;
global $lonW;
global $lat1;
global $lon1;
$sql = $db->prepare("SELECT * FROM tbl_zipcode WHERE (latitude <= $latN AND latitude >= $latS AND longitude <= $lonE AND longitude >= $lonW) AND (latitude != $lat1 AND longitude != $lon1) AND city != '' ORDER BY state, city, latitude, longitude");
$results = $sql->execute();
if(!$results) {
echo "Database Query 2 Error \n";
die;
}
$rs = $sql->fetchAll();
return $rs;
}
运行功能&amp; Foreach循环:
$data = radiusContent();
if(!$data){
echo "No Additional Zip Codes Found Within Search Radius - Increase Radius Search Distance \n";
die;
}else {
foreach($data as $row) {
$truedistance = acos(sin(deg2rad($lat1)) * sin(deg2rad($row['latitude'])) + cos(deg2rad($lat1)) * cos(deg2rad($row['latitude'])) * cos(deg2rad($row['longitude']) - deg2rad($lon1))) * $r;
$zcity = $row['city'];
$zstate = $row['state_abbrv'];
$zip_code = $row['zip_code'];
$latitude = $row['latitude'];
$longitude = $row['longitude'];
$miles = $truedistance;
插入临时表:
if($miles <= $distance) {
$insert = $db->prepare("INSERT INTO z123 (zcity, zstate, zip_code, latitude, longitude, miles)
VALUES ('$zcity', '$zstate', '$zip_code', '$latitude', '$longitude', '$miles')");
$result = $insert->execute();
if(!$result){
echo "Data Insert Failed";
}
}
}
(在PHP代码上方的FYI在脚本中按行顺序排列)
由于
注意:澄清任何混淆:
$result = $insert->execute();
if(!$result) {
echo "Data Insert Failed";
}
如果我的sql语句中有任何错误,是否表名不存在,列名不存在,错误的mysql语法等等,我会得到&#34;数据插入失败&#34;信息。
所以要测试,
如果我使用CREATE TEMPORARY TABLE运行上面的代码我没有错误(只是没有数据插入到表中)。
测试1:如果我故意将临时表名更改为不存在的表名,我会得到上面的错误消息&#34;数据插入失败&#34;,这应该证明表存在于原始代码中。
测试2:如果我在INSERT INTO语句中使用正确的临时表名并完整地删除了CREATE TEMPARARY TABLE语句(包括相关代码),我现在得到上面的错误消息&#34;数据插入失败&#34 ;,再次证明表格存在于原始代码中。
更新:解决方案-FIX
我正在使用&#34;包括&#39; conn.php&#39;;&#34;在每个函数中而不是使用&#34; global $ db&#34;为我的连接($ db在我的conn.php文件中定义)。虽然这不是关闭任何现有的会话,但它为我的脚本中的每个函数打开了额外的(多个)会话。
在每个功能中导致多个连接的原始代码示例:
<?php
include 'conn.php';
function myFunctionName(){
include 'conn.php';
(my funciton code here)
}
解决方案 - 在功能中正确连接数据库的方法:
<?php
include 'conn.php';
function myFunctionName(){
global $db;
(my funciton code here)
}
注意:&#34;全球$ db;&#34;在&#34; conn.php&#34;中定义文件。