Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用数组";“钥匙”;在MySQL WHERE子句中_Php_Mysql_Arrays - Fatal编程技术网

Php 使用数组";“钥匙”;在MySQL WHERE子句中

Php 使用数组";“钥匙”;在MySQL WHERE子句中,php,mysql,arrays,Php,Mysql,Arrays,我有一个由邮政编码范围搜索生成的数据集: $zips: key -> value 11967 -> 0.5 11951 -> 1.3 关键是邮政编码(我需要查询数据库),值是距离用户输入的邮政编码的英里数。我需要获取密钥(邮政编码)并搜索数据库,最好使用类似于我当前查询的MySQL查询: $getlistings = mysql_query("SELECT * FROM stores WHERE zip IN ($zips)"); 另一种选择是在代码中以某种方式更改数组。

我有一个由邮政编码范围搜索生成的数据集:

$zips:

key -> value
11967 -> 0.5
11951 -> 1.3
关键是邮政编码(我需要查询数据库),值是距离用户输入的邮政编码的英里数。我需要获取密钥(邮政编码)并搜索数据库,最好使用类似于我当前查询的MySQL查询:

$getlistings = mysql_query("SELECT * FROM stores WHERE zip IN ($zips)");

另一种选择是在代码中以某种方式更改数组。我尝试在代码中查找数组最初生成的位置,但找不到它。任何帮助都将不胜感激!!谢谢:)

您可以将数组键转换为与SQL兼容的字符串。例如:

'11967', '11951'
然后在查询中使用该字符串

因为SQL查询不知道php数组是什么,而且(据我所知)没有好的方法(只提取键并用引号括起来),所以这可能是最好的选择


编辑:正如Iongut G.Stan所写(并给出了一个例子),使用内爆和数组映射函数将使您达到目的。但是,我相信提供的解决方案只有在列定义为数字时才有效。字符列需要在in子句中用撇号包围元素。

您可以将数组键转换为与SQL兼容的字符串。例如:

'11967', '11951'
然后在查询中使用该字符串

因为SQL查询不知道php数组是什么,而且(据我所知)没有好的方法(只提取键并用引号括起来),所以这可能是最好的选择

编辑:正如Iongut G.Stan所写(并给出了一个例子),使用内爆和数组映射函数将使您达到目的。但是,我相信提供的解决方案只有在列定义为数字时才有效。字符列需要在in子句中用撇号包围元素。

应该是您要查找的内容

$zip = array_keys($zips);      # gives you simple array(11967, 11951);
implode(', ', $zip);           # results in: '11967, 11951'
应该是你要找的

$zip = array_keys($zips);      # gives you simple array(11967, 11951);
implode(', ', $zip);           # results in: '11967, 11951'

为了获得最佳性能,您应该创建一个临时表,用您的邮政编码填充它,并进行如下查询:

SELECT  *
FROM    stores
JOIN    temptable
ON      zip = tempvalue

当然,只有在对
ZIP
列进行索引时,这才会更加有效。

为了获得最佳性能,您应该创建一个临时表,用邮政编码填充它,并按如下方式进行查询:

SELECT  *
FROM    stores
JOIN    temptable
ON      zip = tempvalue
当然,只有将
ZIP
列编入索引时,这才会更有效。

这应该可以做到:

// array_map sanitizes the data
$zip_codes = implode(', ', array_map('intval', array_keys($zips)));
$getlistings = mysql_query("SELECT * FROM stores WHERE zip IN ($zip_codes)");
这应该做到:

// array_map sanitizes the data
$zip_codes = implode(', ', array_map('intval', array_keys($zips)));
$getlistings = mysql_query("SELECT * FROM stores WHERE zip IN ($zip_codes)");

无法对其他答案发表评论,因此我要补充一句。取决于您所在的国家以及您对数据的处理方式。。。在德国,有以“0”开头的邮政编码,因此如果要将其与其他数据(例如ZIP geocoord映射)进行比较,则应确保不将其存储为数值,或者确保将其转换为int everywhere,并对输出进行过滤

旧邮政编码有四个数字,新邮政编码有五个。因此,显示一个包含四个数字的新ZIP,因为前导0缺失,这将导致混淆


关于临时表的使用,我认为这取决于表的大小以及查询中使用了多少邮政编码。

无法对其他答案进行评论,因此我要补充一句。取决于您所在的国家以及您对数据的处理方式。。。在德国,有以“0”开头的邮政编码,因此如果要将其与其他数据(例如ZIP geocoord映射)进行比较,则应确保不将其存储为数值,或者确保将其转换为int everywhere,并对输出进行过滤

旧邮政编码有四个数字,新邮政编码有五个。因此,显示一个包含四个数字的新ZIP,因为前导0缺失,这将导致混淆


关于临时表的使用,我想说这取决于表的大小以及查询中使用了多少邮政编码。

我只想说,前面的代码片段给了我一些语法错误,数据库只输出了一个条目,而不是所有相关数据。以下代码片段对我很有用:

implode("','", $zipNumbers);

我只想说明一下,前面的代码片段给了我一些语法错误,数据库只输出了一个条目而不是所有相关数据。以下代码片段对我很有用:

implode("','", $zipNumbers);

这是我正在考虑的事情之一,但我不知道该怎么做。你能举个例子吗?:)这是我正在考虑的事情之一,但我不知道该怎么做。你能举个例子吗?:)那很有趣。你的博客上有关于这方面的文章吗?有什么基准吗?
@Ionut
:还没有文章(一个好主意
顺便说一句,我想我今天或明天会写一篇),但它是(当然,如果列被索引的话)
MySQL
似乎在
范围内的某个地方使用了线性算法。这很有趣。你的博客上有关于这方面的文章吗?有什么基准吗?
@Ionut
:还没有文章(一个好主意
顺便说一句,我想我今天或明天会写一篇),但它是(当然,如果列被索引的话)
MySQL
似乎在
范围内的某个地方使用了线性算法。只要列是数字,这种算法就可以工作。如果是char,则不会。我想如果他使用的是miles,他肯定有数字列;)嘿,我在表定义中看到了奇怪的东西。你永远不知道。当然将
strval
映射到数组会很容易解决这个问题。我对php的了解还不够,不能说strval可以工作,但是如果列是非数字的,并且in子句中使用的字符串的格式与你在上面的答案中的格式相同(即,整个字符串周围的撇号,而不是每个单独的元素),然后SQL将在查询中不返回任何内容(除非该行的列值包含确切的字符串)。只要该列是数字,这种方法就有效。如果是char,则不会。我想如果他使用的是miles,他肯定有数字列;)嘿,我有