【问题标题】:MySQL Returns different number of rows on localhost vs live server for the same codeMySQL 在 localhost 和 live 服务器上为相同的代码返回不同数量的行
【发布时间】:2016-06-07 07:15:07
【问题描述】:

我有一个简单的表单,它需要文本区域中的站点列表,并在右侧为每个站点返回一个 id。这是我在本地主机上的屏幕截图...我在本地主机和实时服务器上都有相同的表名、列名、记录数。 这是在实时服务器上具有相同查询的同一页面的屏幕截图...

这是我在两个页面上使用的代码

$conn = new PDO("mysql:host=$host;dbname=$db;charset=$charset", $user, $pass);
                if(isset($_POST["busnumber"], $_POST["busroute"])){

                    $stops = explode(PHP_EOL, $_POST["busroute"]);
                    $sql = 'SELECT * FROM stops WHERE stop_name LIKE :stop';
                    $statement = $conn->prepare($sql);
                    $statement->setFetchMode(PDO::FETCH_ASSOC);
                    foreach($stops as $stop){
                        $statement->bindValue(':stop', $stop);
                        $statement->execute();
                        $results = $statement->fetchAll();
                        foreach($results as $result){
                            echo $result['stop_id'].' '.$result['stop_name']."</br>";
                        }

                    }
                }

如您所见,它仅在实时服务器上返回最后一行的 ID。有人可以告诉我这是怎么可能的以及我缺少什么吗?

编辑 1

注意当我反转文本区域中输入的数据时会发生什么 本地主机现在显示两个 id

猜猜服务器反转后显示什么?只有最后一行!

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    您不需要 setFetchMode()。在我使用 PDO 的时候,我总是使用 bindParam() 和 fetch() 以及 PDO 的最默认设置获得最好的结果,这意味着只需将 errormode 设置为 exception 并将 charset 设置为 utf8,如下所示:

     try
        {
            $con = new PDO("mysql:host=".$host.";dbname=".$db_name, $user, $password);
        }
        catch(PDOException $e){
            die("ERROR ". $e->getMessage());
        }
    
        $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $con->exec("SET NAMES utf8");
    

    获取任何这样的结果

    while($r = $statement->fetch())
    {
        echo $r['id'];
    }
    

    每当有人使用不同的设置时,我注意到他们遇到了问题。

    不妨试试这个。

    【讨论】:

    • 刚试了一下,还是一样,在本地主机上一切正常,但在服务器上它只返回文本区域内最后一项的数据
    • 您可以使用 print_r 从文本字段中调试数组,看看它是否真的正确获取了所有条目。
    【解决方案2】:

    这很简单。如果您有权访问,请通过 phpmyadmin 检查您的实时数据库,并从 phpmyadmin 运行您的查询,就像您从 php 代码运行它一样。可能是你在直播时对 mysql 或 php 有一些限制。并且还要检查本地主机上的数据库版本并使用 php 版本。让我知道 phpmyadmin 查询的结果谢谢!

    【讨论】:

    • 我会知道它是否那么简单,我不是新手程序员,但无论如何感谢您的回答
    【解决方案3】:

    只是猜测问题。我真的不认为这个答案是否正确。所以请提前原谅我。

    PDOStatement::fetchAll() 返回一个由查询返回的所有行组成的数组。从这个事实我们可以得出两个结论:

    1. 如果选择了很多行,则不应使用此功能。在 这种情况下使用传统的while循环,获取行 一个接一个,而不是一次将它们全部放入数组中。 “许多” 意味着比它适合在普通网页上显示的更多。
    2. 此功能在现代 Web 应用程序中非常有用, 在获取期间从不立即输出数据,而是传递它 到模板。

    来源:PDO Tutorial

    【讨论】:

      【解决方案4】:

      我修复了错误。我已经在另一个帖子中详细回答了这个问题,我从HERE链接到那个帖子谢谢大家的时间和回答

      【讨论】:

        猜你喜欢
        • 2012-02-05
        • 2013-11-19
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 2014-06-03
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        相关资源
        最近更新 更多