从MySQL查询中创建数组的PHP方法

9

我有一个小问题不太明白。我有一个数据库,其中包含所有者和类型(当然还有更多)。我想获取所有所有者等于当前用户的类型值列表,但是我只得到了两个结果。

$sql = "SELECT type FROM cars WHERE owner='".mysql_real_escape_string($_SESSION['username'])."' AND selling='0' ORDER BY id DESC "; 

 $result = mysql_query($sql,$con); 

 print_r(mysql_fetch_array($result));

输出结果:

Array ( [0] => 18 [type] => 18 )

并且

$sql = "SELECT type FROM cars WHERE owner='".mysql_real_escape_string($_SESSION['username'])."' AND selling='0' "; 

输出结果:

Array ( [0] => 16 [type] => 16 ) 

结果应该是一个数组,类似于19、19、18、17、16。这些都是我作为所有者设置的类型。

我现在已经搞定了:

for ($x = 0; $x < mysql_num_rows($result); $x++){
 $row = mysql_fetch_assoc($result);  
 echo $row['type']; 
}

这里我正确地打印出了所有的值,但是我需要创建一个包含所有值的数组。我认为我可以使用array_push,但是肯定有更好的方法。我想用一个简单的mysql查询获取所有类型的值。

7个回答

32
很多时候,这是通过一个 while 循环来完成的:
$types = array();

while(($row =  mysql_fetch_assoc($result))) {
    $types[] = $row['type'];
}

看一下文档中的示例。

mysql_fetch_*方法总是获取结果集中的下一个元素:

返回与获取的行对应的字符串数组,如果没有更多行,则返回FALSE。

这就是为什么while循环起作用的原因。如果没有更多的行了,$row将是falsewhile循环就会退出。

之所以看起来mysql_fetch_array获取了多行,是因为默认情况下它将结果作为普通的关联值返回:

通过使用MYSQL_BOTH(默认值),您将获得一个同时具有关联和数字索引的数组。

您的示例最好地展示了这一点,您获得了相同的值18,您可以通过$v[0]$v['type']访问它。


7
THE CORRECT WAY ************************ THE CORRECT WAY

while($rows[] = mysqli_fetch_assoc($result));
array_pop($rows);  // pop the last row off, which is an empty row

是的!这是正确的方式。 - Master Coder
他没有使用mysqli,而是在使用遗留的mysql。 - DropHit
3
“Legacy mysql”?你是指已经被弃用的Mysql吧。 - Master Coder
是的,这是旧版的MySQL - 比答案所涉及的版本还要老。 - DropHit

3

您确实需要遍历...

$typeArray = array();
$query = "select * from whatever";
$result = mysql_query($query);

if ($result) {
    while ($record = mysql_fetch_array($results)) $typeArray[] = $record['type'];
}

0
$type_array = array();    
while($row = mysql_fetch_assoc($result)) {
    $type_array[] = $row['type'];
}

0

你也可以使用一个包装器来使生活更轻松,例如使用ADODb:

$myarray=$db->GetCol("SELECT type FROM cars ".
    "WHERE owner=? and selling=0", 
    array($_SESSION['username']));

一个好的包装器也会为你完成所有逃逸操作,让阅读更加简单。

0
while($row = mysql_fetch_assoc($result)) {
  echo $row['type'];
}

2
他的代码已经在做这个了。他想把它变成一个数组。回显不会解决这个问题。 - Treffynnon

0

你可能想去维基百科上查看SQL注入文章。在“十六进制转换”部分下面,可以找到一个小函数来执行你的SQL命令,并返回一个包含信息的数组。

https://en.wikipedia.org/wiki/SQL_injection

我编写了dosql()函数,因为我厌倦了我的SQL命令在各个地方执行,忘记检查错误,并且能够将所有命令记录到日志文件中以供以后查看。该例程免费提供给任何想要将其用于任何目的的人使用。实际上,我已经扩展了这个函数,因为我希望它能做更多的事情,但是这个基本函数是从SQL调用中获取输出的良好起点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接