使用数组的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用nodejs在Mysql查询中传递数组

如何使用动态数组使用where子句查询mysql数据库

node-mysql 在查询中使用数组

我有一个整数数组,如何在 mysql 查询(在 php 中)中使用每个整数? [复制]

我有一个整数数组,如何在 mysql 查询(在 php 中)中使用每个整数? [复制]

如何使用 MySQL 查询 json 数组