【问题标题】:Why does this query show only one result?为什么这个查询只显示一个结果?
【发布时间】:2012-05-13 12:43:43
【问题描述】:

即使有多个匹配条目(完全或部分匹配),我在下面的查询也只会显示一个结果。如何修复它以便返回所有匹配的条目:

//$allowed is a variable from database.

$sql = "SELECT `users`.`full_name`, `taglines`.`name`, `users`.`user_id` FROM 
`users`  LEFT JOIN `taglines` ON `users`.`user_id` = `taglines`.`person_id`
 WHERE ( `users`.`user_settings` = '$allowed' ) and ( `users`.`full_name` 
 LIKE '%$q%' ) LIMIT $startrow, 15";

$result = mysql_query($sql);

$query = mysql_query($sql) or die ("Error: ".mysql_error());

$num_rows1 = mysql_num_rows($result);

if ($result == "")
{
    echo "";
}
echo "";


$rows = mysql_num_rows($result);

if($rows == 0)
{

}
elseif($rows > 0)
{
    while($row = mysql_fetch_array($query))
    {
        $person = htmlspecialchars($row['full_name']);
    }
}
}  

print $person;

【问题讨论】:

  • 可能是因为limit子句中的$startrow
  • 当我看到 PHP 代码没有使用 PHP Prepared Statements 来防止 SQL Injection 漏洞时,我很担心。我希望您正在清理尚未粘贴到此处的代码中的变量。如果没有,请考虑重写代码以使用 PDO 准备语句,而不是尝试清理您的变量。
  • @sarnold 是的,别担心。他们正在被消毒。根据 stackoverflow 专家的说法,无论我使用什么、准备什么或这种方式,风险都是一样的。
  • @sarnold 顺便说一句,如果我单独清理与使用 PDO,这不是一回事吗?
  • @Ariel:大致相同,是的,但是使用 PDO,您不能搞砸它而忘记或双重清理变量。

标签: php sql search conditional-statements sql-like


【解决方案1】:

因为您在每次迭代时都会覆盖 $person

如果您期望超过一个,请将其保存在 $person[] 数组中。然后在您打算输出时使用 foreach 循环遍历它。

不相关但你也查询了两次,你只需要1个$result = mysql_query($sql);

更新(简单输出示例):

<?php 
$person=array();

while($row = mysql_fetch_array($query)){
 $person[] = array('full_name'=>$row['full_name'],
                   'email'=>$row['email'],
                   'somthing_else1'=>$row['some_other_column']);
}

//Then when you want to output:
foreach($person as $value){
    echo '<p>Name:'.htmlentities($value['full_name']).'</p>';
    echo '<p>Eamil:'.htmlentities($value['email']).'</p>';
    echo '<p>FooBar:'.htmlentities($value['somthing_else1']).'</p>';
}
?>

或者另一种方法是使用串联在循环内构建输出。

<?php 
$person='';
while($row = mysql_fetch_array($query)){
 $person .= '<p>Name:'.$row['full_name'].'</p>';
 $person .= '<p>Email:'.$row['email'].'</p>';
}

echo $person;
?>

或者只是回应它。

<?php 
while($row = mysql_fetch_array($query)){
 echo '<p>Name:'.$row['full_name'].'</p>';
 echo '<p>Email:'.$row['email'].'</p>';
}
?>

【讨论】:

  • 谢谢。我将 $person[] 添加到 $person = htmlspecialchars($row['full_name']);但是当我打印它时,它会显示“数组”。
  • 使用print_r($person)查看数组内容。
  • 好的。我用 print_r($person);die();并且打印了两个这样的条目:Array([0] => Jack Smith [1] => Jack Wilson)并且这两个都是唯一匹配的名称,所以我知道它是正确的。但现在我如何使这项工作为我的查询工作,就像使用 print $person;然后显示所有返回的条目。
  • 好的,我用 foreach ($person as $key => $value) echo "$value";并且能够做到。
  • 谢谢,但我不想在 while() 之后立即回显它们,而是想在页面的另一部分使用它们?我无法使用变量...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
相关资源
最近更新 更多