【问题标题】:PHP returning less results than mysqlPHP返回的结果比mysql少
【发布时间】:2015-04-02 00:43:37
【问题描述】:

我有一个 mysql 查询,当我在 mysql 控制台中运行时返回 4 个结果,这正是我需要的,但是当我在 PHP 中尝试时,我只得到 2 个结果。我的 PHP 看起来有什么问题吗?我已将查询回显到一个字符串,将其粘贴到控制台中,它也为我提供了我需要的东西。当我回显返回的行数时,它是 2。

<?php
if(isset($_POST['source'])){
    $source = $_POST['source'];
}

if(isset($_POST['destination'])){
    $destination = $_POST['destination'];
}

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "Airport Tracking";
$table ="Flights";
$flag = 0;

// Create connection
$mysqli = new mysqli($servername, $username, $password, $dbname);
if ($mysqli->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

if(isset($_POST['source']) && isset($_POST['destination'])){
$columns= $mysqli -> query("SHOW COLUMNS FROM $table");

$sql = "SELECT *
    FROM Flights a
    JOIN Flights b
    ON a.Destination = b.Source
    AND {$source} = a.Source
    AND {$destination} = b.Destination";

$result = $mysqli -> query($sql);


if($result == FALSE){
    echo "<br><b>Incorrect input</b>";
    $flag = 1;
}
else if($result->num_rows == 0){
    echo "<br><b>Returned no results</b>";
    $flag = 1;
}

}

$array = array();
$i = 0;

if(isset($_POST['source']) && $flag == 0){
 // Display results
echo "<table>";
echo "<thead><tr>";
while ($row = $columns -> fetch_array(MYSQLI_BOTH)) {
    echo "<th>" .$row['Field']. "</th>";
    $array[] = $row['Field'];
}
echo "</tr></thead>";

while ($row = $result -> fetch_array(MYSQLI_BOTH)) {
    echo "<tr>";
    while ($i < sizeof($array)) {
        echo "<td>" .utf8_encode($row[$array[$i]]). "</td>";
        $i++;
    }
    echo "</tr>";
    $i = 0;
}
echo "</table>";

【问题讨论】:

  • 你为什么不直接使用MYSQLI_ASSOC 然后foreach ($row as $value) 而不是那个复杂的while 循环来打印列?
  • 你能给我指出一个演示如何做到这一点的页面吗?另外,这会改变结果吗?
  • 不,它不会改变结果。我看不出有什么不对。您确定手动运行查询时与运行 PHP 脚本时连接到同一个数据库吗?
  • 是的,我是。这就是为什么它让我如此疯狂。
  • 由于您将一个表与其自身连接起来,因此您会得到重复的列名。但是关联数组只能有一个具有给定名称的元素。

标签: php mysql mysqli


【解决方案1】:

当您从自联接返回列时,不要使用SELECT *。 a 和 b 中的列是相同的,但您需要为它们指定不同的名称。所以使用类似的东西:

SELECT a.source AS start, 
       a.flightno AS flight1, 
       a.destination AS connection, 
       b.flightno AS flight2, 
       b.destination AS destination

然后在显示表格的代码中,执行:

while ($row = $result->fetch_assoc()) {
    foreach ($row as $col) {
        echo "<td>" . utf8_encode($col) . "</td>";
    }
}

您还需要更改显示列标题的代码以使用与您选择的这些列相对应的标题,而不是从SHOW COLUMNS 获取它们(因为这只会获取一组列名称) .

【讨论】:

  • 非常感谢,我正要更改我的代码,看看它是否有效。将在几分钟后报告。
  • "SELECT a.col1 AS src_col1, a.col2 AS src_col2 b.col1 AS dst_col1, b.col2 AS dst_col2 FROM Flights a JOIN Flights b ON a.Destination = b.Source AND '{$ source}' = a.Source AND '{$destination}' = b.Destination";
  • 这是我用于查询的字符串。它似乎不起作用。我可能格式错误。
  • 您是否将col1、col2等替换为真实的列名?
  • 哎呀...会那样做。编辑:这是我使用的查询字符串,但我仍然认为它的格式不正确。
【解决方案2】:

您需要在带有空格的字段名称周围加上反引号。您需要像这样更改这些行:

AND `{$source}` = a.Source
AND `{$destination}` = b.Destination";

【讨论】:

  • 表的名称是Flights。 a 和 b 是别名。
  • 这也不对。 {$source} 和 {$destination} 不包含字段名称,它们是来自 POST 参数的文字值。
  • 不幸的是,这给出了相同的结果。
  • 你没看到他的问题部分,他说他回应了查询,然后手动执行了吗?
  • 是的,那是另一回事。我认为根本不是查询格式错误。
猜你喜欢
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2012-12-18
  • 2013-12-10
  • 1970-01-01
相关资源
最近更新 更多