【问题标题】:How to return multiple rows from a table in in php using mysql如何使用mysql从php中的表中返回多行
【发布时间】:2012-12-16 12:45:49
【问题描述】:

我决定为我的家人建立一个梦幻足球网站,但我无法从数据库中返回多行数据。

我想要什么:进行一次 sql 调用并获取整个玩家列表,以便我可以填充一个对象或对象列表。 (如果可以返回整张桌子,那就太好了……)。我的目标是让可供选择的球员列表简单地显示给用户。

目前,通过以下方法进行测试时,我可以看到一些结果(来源:来自 php 文档...)。但是,我不禁对正在发生的事情感到迷茫。我无法在我的大脑中理解这一点。

// My query
$sql = mysql_query("SELECT * FROM players");

//$data = mysql_fetch_array($sql);
while ($row = mysql_fetch_array($sql, MYSQL_NUM)) {
    printf("Name: %s <br/>", $row[1]);
}

这似乎打印了每个玩家的名字。然而如何 'mysql_fetch_array()' 在 while 循环迭代时迭代每一行?此外,由于有多个列,我如何访问每一列...这是否必须进行硬编码,例如:

while ($row = mysql_fetch_array($sql, MYSQL_NUM)) {
    printf("Name: %s <br/>", $row[1]);
    printf("Team: %s <br/>", $row[2]);
    ..
    .
    printf("Team: %s <br/>", $row[5]);
}

最终我将用将相关日期存储在名册对象或其他东西中的代码替换打印语句:

class Roster(){

    $playerName;
    $team;
    $etc.
}

上面的 while 循环方法感觉既困难又笨重。有没有更好的方法来访问所有返回的行?其他人会如何尝试呢?我有限的经验是 C# 和 sql server,它可以通过一些轻松的配置来做一些惊人的事情......立即返回一个列表 ^

如果我不清楚,我会尽快回来查看并进一步评论。我还是个CS学生。感谢您的耐心等待。

【问题讨论】:

标签: php mysql database web


【解决方案1】:

试试这个,

 while($row_data = mysql_fetch_array($row_data))
 {
  $row_player_name = $row_data['column_name_player'];
  $row_team = $row_data['column_team'];
  echo $row_player_name;
  echo $row_team;
}

column_name_player 是包含玩家名称的表的列名。

【讨论】:

  • mysql_fetch_array 是一个更好的选择,因为您不再需要按特定顺序保留数据库表列
  • mysql_fetch_array 将获取 mysql_fetch_row 和 mysql_fetch_assoc 结果。如果您想按列名索引结果,您可能只想坚持使用 mysql_fetch_assoc。
【解决方案2】:

虽然如 Jason 所建议,但请不要使用 mysql_* 函数。但只是为了澄清你的概念

        // My query
        $sql = mysql_query("SELECT * FROM players");

        //$data = mysql_fetch_array($sql);

        while ($row = mysql_fetch_array($sql, MYSQL_NUM)) {
                printf("Name: %s <br/>", $row[1]);
        }

这对于初学者来说是不必要的复杂。除了使用 1 或 2 或 3 之类的行索引,您可以(并且可能应该)简单地使用您的字段名称。

所以更新为喜欢

        // My query
        $sql = mysql_query("SELECT * FROM players");

        //$data = mysql_fetch_array($sql);

        while ($row = mysql_fetch_assoc($sql)) {
                echo "Name:". $row["name"];
                echo "Other Data:". $row["otherdata"];
                echo "<br>";
        }

当然 nameotherdata 只是假设。您将用表中的实际字段名称替换它们

【讨论】:

  • 好的,我会进一步处理这个。感谢这么快回复的几个人。
【解决方案3】:

如果你想检索每一行中的每一列而不需要知道每一列的名称,你可以统计表中的列数。

$queryCols = "SHOW COLUMNS FROM players":
$queryPlayers = "SELECT * FROM players";
$result = mysql_query($queryPlayers);
$playerColumns = mysql_query($queryCols);
$colsResult = mysql_fetch_row($playerCols);
$numFields = count($colsResult);
while ($row = mysql_fetch_array($result)) {
  for ($i = 0; $i < $numFields; $i++) {
    $row[$i]; // Each column in each row
  }
}

这里是mysqli select 语句的示例,它是即将被弃用 mysql_* statements 的继承者:

$DB_NAME = 'test';
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '';

$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);

if (mysqli_connect_errno()) {
 printf('Connection to $s using %s@$s failed: %s\n', 
  $DB_NAME, $DB_USER, $DB_HOST, mysqli_connect_error());
 exit();
}

$query = "SELECT `fname`, `lname`, `team` FROM `players`;";

if ($stmt = $mysqli->prepare($query)) {
 $stmt->execute();
 $stmt->bind_result($fname, $lname, $team);
 $table = <<< TABLE
<table border="1">
  <thead><tr>
   <th>First Name</th><th>Last Name</th><th>Team</th>
  </tr></thead>
  <tbody>
TABLE;
 while ($stmt->fetch()) {
  $table .= "<tr><td>$fname</td><td>$lname</td><td>$team</td></tr>";
 }
 $table .= "</tbody></table>";
 printf($table);
 $stmt->close();
} else {
  printf("Prepared Statement Error: %s\n", $mysqli->error);
}

表格

CREATE TABLE IF NOT EXISTS `players` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `fname` varchar(32) NOT NULL,
  `lname` varchar(32) NOT NULL,
  `team` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

INSERT INTO `players` (`id`, `fname`, `lname`, `team`) VALUES
(1, 'Peyton', 'Manning', 'Denver Broncos'),
(2, 'Matt', 'Ryan', 'Atlanta Falcons'),
(3, 'Tom', 'Brady', 'New England Patriots'),
(4, 'Colin', 'Kaepernick', 'San Francisco 49ers'),
(5, 'Matt', 'Schaub', 'Houston Texans'),
(6, 'Aaron', 'Rodgers', 'Green Bay Packers'),
(7, 'Joe', 'Flacco', 'Baltimore Ravens'),
(8, 'Robert', 'Griffin III', 'Washington Redskins'),
(9, 'Andrew', 'Luck', 'Indianapolis Colts'),
(10, 'Matt', 'Flynn', 'Seattle Seahawks'),
(11, 'Andy', 'Dalton', 'Cincinnati Bengals'),
(12, 'Christian', 'Ponder', 'Minnesota Vikings');

结果:

First Name  Last Name   Team
Peyton      Manning     Denver Broncos
Matt        Ryan        Atlanta Falcons
Tom         Brady       New England Patriots
Colin       Kaepernick  San Francisco 49ers
Matt        Schaub      Houston Texans
Aaron       Rodgers     Green Bay Packers
Joe         Flacco      Baltimore Ravens
Robert      Griffin III Washington Redskins
Andrew      Luck        Indianapolis Colts
Matt        Flynn       Seattle Seahawks
Andy        Dalton      Cincinnati Bengals
Christian   Ponder      Minnesota Vikings

【讨论】:

  • 您在$queryPlayers = "SELECT * FROM players; 末尾缺少"
【解决方案4】:

//This function will print 5 rows 10 columns 

$n = 5; 
$m = 10;
$tr='';
	
 for($r=0; $r<$n; $r++)
  {
	$td='';		
		
   for ($c=0; $c<$m; $c++)
        {
		$td = $td."<td>".$c.$r."</td>";
		}
			
	   $tr =$tr."<tr>".$td. "</tr>";
	}

	echo $otp = "<table border='0'>".$tr."</table>";

【讨论】:

  • 这段脚本将[5x10]矩阵查询结果转换为[10X5]矩阵
  • 例如 select a, b, c, d, e from table_name limit 10 将产生如下结果 00 10 20 30 40 01 11 21 31 41 02 12 22 32 42 03 13 23 33 43 04 14 24 34 44 05 15 25 35 45 06 16 26 36 46 07 17 27 37 47 08 18 28 38 48 09 19 29 39 49 上面的脚本将转换为 00 10 20 30 40 50 60 5 121 80 310 4 01 61 71 81 91 02 12 22 32 42 52 62 72 82 92 03 13 23 33 43 53 63 73 83 93 04 14 24 34 44 54 64 74 84 94
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2017-08-27
  • 2014-03-14
  • 2016-12-13
  • 2011-07-18
相关资源
最近更新 更多