使用数组的 MySQL 查询
Posted
技术标签:
【中文标题】使用数组的 MySQL 查询【英文标题】:MySQL query using an array 【发布时间】:2010-11-09 06:08:04 【问题描述】:我正在尝试使用数组查询 mysql 数据库,但遇到了问题!
我有一个名为 clients 的表,我希望能够从“sector”列等于 $sectorlink 的所有行中选择“name”。
然后我想将所有名称放入一个数组中,以便我可以执行下一个查询:从另一个表中选择所有行,其“客户”列等于从第一个查询返回的名称之一。我做错了什么,因为它返回了一个致命的 SQL 错误。我对所有变量感到困惑!
$sectorlink 和 $connection 是在此代码之外定义的唯一变量
有什么建议吗?
$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);
while($row = mysql_fetch_array($clientresult))
foreach($row AS $key => $value)$temp[] = '"'.$value.'"';
$thelist = implode(",",$temp);
$query = "SELECT count(*) FROM studies WHERE client IN ($row) ORDER BY (date) desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
【问题讨论】:
【参考方案1】:第二个查询应该使用$thelist
而不是$row
,并且它应该在while
循环之外。处理单行时,foreach
循环是不必要的。您可以使用简单的$row[0]
访问$row
中的名称。像这样的东西(未经测试):
$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);
while($row = mysql_fetch_array($clientresult))
$temp[] = '"'.$row[0].'"';
$thelist = implode(",",$temp);
$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY (date) desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
警告:请注意,您的代码极易受到SQL injection attacks 的攻击。这对于测试或内部开发来说很好,但如果这段代码要运行在 Fort Knox 网站上,你需要对其进行相当多的修复。仅供参考。 :-)
【讨论】:
太棒了!非常感谢。是的,我需要修复代码以防止注入,谢谢提醒。 P.S.您也可以在带有子选择的单个查询中执行此操作:SELECT count(*) FROM studies WHERE client IN (SELECT name FROM clients WHERE sector = '$sectorlink') ORDER BY (date) desc
。【参考方案2】:
试试这个:
$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);
while($row = mysql_fetch_array($clientresult))
$client = $row['name'];
$query = "SELECT * FROM studies WHERE client='$client' ORDER BY date DESC";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
/* echo results here */
【讨论】:
【参考方案3】:几件事。首先,您在那里有一个不必要的循环。试试:
while (list($name) = mysql_fetch_row($clientresult))
$temp[] = $name;
构建你的临时数组。
其次,IN
子句的部分是字符串,所以当你 implode 时,你需要将每个值括在引号中:
$thelist = "'". implode("','", $temp) . "'";
最后,在您的查询中,您将$row
传递给IN
子句,您应该传递$thelist
:
$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY date desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
总之:
$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);
while (list($name) = mysql_fetch_row($clientresult))
$temp[] = $name;
$thelist = "'". implode("','", $temp) . "'";
$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY date desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
【讨论】:
【参考方案4】:我希望您最好在一个带有连接的查询中执行此操作:
$query = "SELECT COUNT(*) FROM `studies` INNER JOIN `clients` on studies.client = clients.name WHERE clients.sector = '$sectorlink' ORDER BY studies.date DESC";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
【讨论】:
以上是关于使用数组的 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
我有一个整数数组,如何在 mysql 查询(在 php 中)中使用每个整数? [复制]