Query=>Array=>Output = PHP 警告:非法偏移类型
Query=>Array=>Output = PHP Warning: Illegal offset type
我尝试selectmysql数据,将它们保存在二维数组中并输出数据。我收到上面提到的每一列和每一行的错误消息。
谁能指出我的错误。我怎样才能让它工作?
这是代码:
// connect database
$db_connection = new mysqli (MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
// execute query
$query_result = $db_connection->query($sql_career);
// save carrer data
while( $row = $query_result->fetch_assoc() )
{
$career[]['id'] = $row['career_id'];
$career[]['season'] = $row['career_season'];
$career[]['matches'] = $row['career_matches'];
$career[]['goals'] = $row['career_goals'];
$career[]['team_name'] = $row['career_team_name'];
}
// output
echo '<table border="1">';
foreach ($career as $i)
{
echo "<tr>";
echo "<td>". $career[$i]['id'] . "</td>";
echo "<td>". $career[$i]['season'] . "</td>";
echo "<td>". $career[$i]['team_name'] . "</td>";
echo "<td>". $career[$i]['matches'] . "</td>";
echo "<td>". $career[$i]['goals'] . "</td>";
echo "</tr>";
}
echo "</table>";
只需替换此代码,
您已经使用了 foreach ,它给出了当前数组。
foreach ($career as $i)
{
echo "<tr>";
echo "<td>". $i['id'] . "</td>";
echo "<td>". $i['season'] . "</td>";
echo "<td>". $i['team_name'] . "</td>";
echo "<td>". $i['matches'] . "</td>";
echo "<td>". $i['goals'] . "</td>";
echo "</tr>";
}
你可以试试这个...
while( $row = $query_result->fetch_assoc() )
{
$career[] = $row;
}
// output
echo '<table border="1">';
foreach ($career as $i)
{
echo "<tr>";
echo "<td>". $i['id'] . "</td>";
echo "<td>". $i['season'] . "</td>";
echo "<td>". $i['team_name'] . "</td>";
echo "<td>". $i['matches'] . "</td>";
echo "<td>". $i['goals'] . "</td>";
echo "</tr>";
}
echo "</table>";
如果你有一个成功的行查询,那么只需内爆这些行并且只循环一次。
if (!$query_result = $db_connection->query($sql_career)) {
// check error
} elseif (!$query_result->num_rows) {
// no rows
} else {
echo '<table border="1">';
// I assume you have column headings in mind, add them here
while($row = $query_result->fetch_assoc()) {
echo "<tr><td>", implode("</td><td>", $row), "</td></tr>";
}
echo "</table>";
}
或者如果您有将结果集存储为多维数组的实际需求,您可以使用Miller's top voted comment in the manual。
for ($set = array (); $row = $query_result->fetch_assoc(); $set[] = $row);
根据上面的 one-liner,您可以像这样应用相同的 "loop and implode" 逻辑:
if (sizeof($set)) {
echo '<table border="1">';
foreach ($set as $row) {
echo "<tr><td>", implode("</td><td>", $row), "</td></tr>";
}
echo "</table>";
}
或者你可以全部写出来:
echo '<table border="1">';
foreach ($set as $row){
echo "<tr>";
echo "<td>{$row['career_id']}</td>";
echo "<td>{$row['career_season']}</td>";
echo "<td>{$row['career_team_name']}</td>";
echo "<td>{$row['career_matches']}</td>";
echo "<td>{$row['career_goals']}</td>";
echo "</tr>";
}
echo "</table>";
如果您想提前操作关联键,您可以调整 SELECT 子句,例如:
SELECT career_id AS 'id', career_season as 'season', career_team_name AS 'team_name', career_matches AS 'matches', career_goals AS 'goals' FROM ...
虽然这不是最佳做法,但它确实解决了我最初提出的警告问题。
// save carrer data
$row_counter = 0;
while( $row = $query_result->fetch_assoc() )
{
$row_counter++;
$career[$row_counter]['id'] = $row['career_id'];
$career[$row_counter]['season'] = $row['career_season'];
$career[$row_counter]['matches'] = $row['career_matches'];
$career[$row_counter]['goals'] = $row['career_goals'];
$career[$row_counter]['team_name'] = $row['career_team_name'];
}
// output
echo '<table border="1">';
foreach ($career as $i)
{
echo "<tr>";
echo "<td>". $i['id'] . "</td>";
echo "<td>". $i['season'] . "</td>";
echo "<td>". $i['team_name'] . "</td>";
echo "<td>". $i['matches'] . "</td>";
echo "<td>". $i['goals'] . "</td>";
echo "</tr>";
}
echo "</table>";
在对@mickmackusa 提案进行进一步测试后,我得出了以下解决方案。输出功能仅供测试。主要重点是准备和提供数据供以后使用。
function get_career($player_id) {
// sql placeholder to save code here
$sql_career = "...";
// connect database
$db_connection = new mysqli (MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
if (!$query_result = $db_connection->query($sql_career)) {
// check error
} elseif (!$query_result->num_rows) {
// no rows
} else {
for (
$career = array ();
$row = $query_result->fetch_assoc();
$career[] = $row);
}
return $career;
} // function end
function output_career($player_id) {
// function call, get career data
$career = get_career($player_id);
// output
echo '<table border="1">';
foreach ($career as $career)
{
echo "<tr>";
echo "<td>". $career['id'] . "</td>";
echo "<td>". $career['season'] . "</td>";
echo "<td>". $career['team_id'] . "</td>";
echo "<td>". $career['team_name'] . "</td>";
echo "<td>". $career['country_name'] . "</td>";
echo "<td>". $career['country_abbreviation'] . "</td>";
echo "<td>". $career['league_name'] . "</td>";
echo "<td>". $career['matches'] . "</td>";
echo "<td>". $career['goals'] . "</td>";
echo "<td>". $career['status_name'] . "</td>";
echo "</tr>";
}
echo "</table>";
} // function end
我尝试selectmysql数据,将它们保存在二维数组中并输出数据。我收到上面提到的每一列和每一行的错误消息。
谁能指出我的错误。我怎样才能让它工作?
这是代码:
// connect database
$db_connection = new mysqli (MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
// execute query
$query_result = $db_connection->query($sql_career);
// save carrer data
while( $row = $query_result->fetch_assoc() )
{
$career[]['id'] = $row['career_id'];
$career[]['season'] = $row['career_season'];
$career[]['matches'] = $row['career_matches'];
$career[]['goals'] = $row['career_goals'];
$career[]['team_name'] = $row['career_team_name'];
}
// output
echo '<table border="1">';
foreach ($career as $i)
{
echo "<tr>";
echo "<td>". $career[$i]['id'] . "</td>";
echo "<td>". $career[$i]['season'] . "</td>";
echo "<td>". $career[$i]['team_name'] . "</td>";
echo "<td>". $career[$i]['matches'] . "</td>";
echo "<td>". $career[$i]['goals'] . "</td>";
echo "</tr>";
}
echo "</table>";
只需替换此代码,
您已经使用了 foreach ,它给出了当前数组。
foreach ($career as $i)
{
echo "<tr>";
echo "<td>". $i['id'] . "</td>";
echo "<td>". $i['season'] . "</td>";
echo "<td>". $i['team_name'] . "</td>";
echo "<td>". $i['matches'] . "</td>";
echo "<td>". $i['goals'] . "</td>";
echo "</tr>";
}
你可以试试这个...
while( $row = $query_result->fetch_assoc() )
{
$career[] = $row;
}
// output
echo '<table border="1">';
foreach ($career as $i)
{
echo "<tr>";
echo "<td>". $i['id'] . "</td>";
echo "<td>". $i['season'] . "</td>";
echo "<td>". $i['team_name'] . "</td>";
echo "<td>". $i['matches'] . "</td>";
echo "<td>". $i['goals'] . "</td>";
echo "</tr>";
}
echo "</table>";
如果你有一个成功的行查询,那么只需内爆这些行并且只循环一次。
if (!$query_result = $db_connection->query($sql_career)) {
// check error
} elseif (!$query_result->num_rows) {
// no rows
} else {
echo '<table border="1">';
// I assume you have column headings in mind, add them here
while($row = $query_result->fetch_assoc()) {
echo "<tr><td>", implode("</td><td>", $row), "</td></tr>";
}
echo "</table>";
}
或者如果您有将结果集存储为多维数组的实际需求,您可以使用Miller's top voted comment in the manual。
for ($set = array (); $row = $query_result->fetch_assoc(); $set[] = $row);
根据上面的 one-liner,您可以像这样应用相同的 "loop and implode" 逻辑:
if (sizeof($set)) {
echo '<table border="1">';
foreach ($set as $row) {
echo "<tr><td>", implode("</td><td>", $row), "</td></tr>";
}
echo "</table>";
}
或者你可以全部写出来:
echo '<table border="1">';
foreach ($set as $row){
echo "<tr>";
echo "<td>{$row['career_id']}</td>";
echo "<td>{$row['career_season']}</td>";
echo "<td>{$row['career_team_name']}</td>";
echo "<td>{$row['career_matches']}</td>";
echo "<td>{$row['career_goals']}</td>";
echo "</tr>";
}
echo "</table>";
如果您想提前操作关联键,您可以调整 SELECT 子句,例如:
SELECT career_id AS 'id', career_season as 'season', career_team_name AS 'team_name', career_matches AS 'matches', career_goals AS 'goals' FROM ...
虽然这不是最佳做法,但它确实解决了我最初提出的警告问题。
// save carrer data
$row_counter = 0;
while( $row = $query_result->fetch_assoc() )
{
$row_counter++;
$career[$row_counter]['id'] = $row['career_id'];
$career[$row_counter]['season'] = $row['career_season'];
$career[$row_counter]['matches'] = $row['career_matches'];
$career[$row_counter]['goals'] = $row['career_goals'];
$career[$row_counter]['team_name'] = $row['career_team_name'];
}
// output
echo '<table border="1">';
foreach ($career as $i)
{
echo "<tr>";
echo "<td>". $i['id'] . "</td>";
echo "<td>". $i['season'] . "</td>";
echo "<td>". $i['team_name'] . "</td>";
echo "<td>". $i['matches'] . "</td>";
echo "<td>". $i['goals'] . "</td>";
echo "</tr>";
}
echo "</table>";
在对@mickmackusa 提案进行进一步测试后,我得出了以下解决方案。输出功能仅供测试。主要重点是准备和提供数据供以后使用。
function get_career($player_id) {
// sql placeholder to save code here
$sql_career = "...";
// connect database
$db_connection = new mysqli (MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
if (!$query_result = $db_connection->query($sql_career)) {
// check error
} elseif (!$query_result->num_rows) {
// no rows
} else {
for (
$career = array ();
$row = $query_result->fetch_assoc();
$career[] = $row);
}
return $career;
} // function end
function output_career($player_id) {
// function call, get career data
$career = get_career($player_id);
// output
echo '<table border="1">';
foreach ($career as $career)
{
echo "<tr>";
echo "<td>". $career['id'] . "</td>";
echo "<td>". $career['season'] . "</td>";
echo "<td>". $career['team_id'] . "</td>";
echo "<td>". $career['team_name'] . "</td>";
echo "<td>". $career['country_name'] . "</td>";
echo "<td>". $career['country_abbreviation'] . "</td>";
echo "<td>". $career['league_name'] . "</td>";
echo "<td>". $career['matches'] . "</td>";
echo "<td>". $career['goals'] . "</td>";
echo "<td>". $career['status_name'] . "</td>";
echo "</tr>";
}
echo "</table>";
} // function end