【问题标题】:mysqli and pdo returns 0 while connection works successfullymysqli 和 pdo 在连接成功时返回 0
【发布时间】:2018-09-04 14:27:19
【问题描述】:

我正在尝试从托管在 mamp 中的 mysql localhost 服务器访问下表。我尝试了多种方法,但它们似乎都提供了相同的结果(“0 个结果”)。我究竟做错了什么?我提供了PDO和mysqli方法,如果有人能指出错误,我将非常感谢!

CREATE TABLE `Orders` (
    OrderID INT(11),
    ParentOrderID INT(11),
    AccountID INT(11),
    RestaurantID INT(11),
    EmployeeID INT(11),
    -- CouponID INT(11),
    BillingID INT(11),
    ShippingID INT(11),
    CreateDate TIMESTAMP,
    OrderTime TIMESTAMP,
    IsTimeOrder BIT,
    IsDelivery BIT,
    PRIMARY KEY (OrderID)
)   ENGINE = INNODB;

我尝试使用的 mysqli 脚本

<?php

$servername = "localhost";
$port = "3306";
$schema = "es_test";
$username = "root";
$password = "root";

$conn = new mysqli($servername, $username, $password, $schema, $port);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} else {
    echo "Connected successyfully <br>";
}

$sql = "
    SELECT
        *
    FROM
        `es_test`.`Orders`
    SORT BY
        `OrderID` ASC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "OrderID: " . $row["OrderID"] . " - CreateDate: " . $row["CreateDate"] . "<br>";
    }
} else {
    echo "0 results";
}

$conn->close();

和 PDO 代码

<?php
class Order{
    private $conn;
    private $table_name = "orders";
    //tableheaders

    public function __construct($db){
        $this->conn = $db;
    }

    function read(){
        $query = "
            SELECT 
                *
            FROM
                " . $this->table_name;

        $stmt = $this->conn->prepare($query);
        $stmt->execute();
        return $stmt;
    }
}

为什么总是返回 0 个结果?是我的 MySQL 服务器一直拒绝它吗?

【问题讨论】:

  • 你为什么同时使用mysqli和pdo?你的问题不清楚
  • 我从 PDO 开始,但它并没有达到我希望的结果。所以我尝试使用 mysqli,但它给出了相同的结果。我在想这是我一直错过的某种连续性错误。这就是我双向发布的原因;)
  • 我看不出你在哪里使用那个类。
  • 您是否启用了适当的 PHP 错误报告? var_dump($result) 显示什么?
  • 如果你检查$conn-&gt;error会发生什么?

标签: php mysql mysqli pdo


【解决方案1】:

你使用

SORT BY

在 SQL 中,语法应该是:

ORDER BY

https://dev.mysql.com/doc/refman/8.0/en/select.html

您还应该在每次调用 query()prepare()execute() 后检查错误情况。或者让驱动程序在遇到错误时抛出异常。

在 Mysqli 中,您可以通过启用报告模式 before 连接来做到这一点:

mysqli_report(MYSQLI_REPORT_ALL);
$conn = new mysqli(...);

我测试了你的代码,当我启用异常时,我得到了这个:

Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right 
syntax to use near 'BY
        `OrderID` ASC' at line 5 in /Users/bkarwin/p.php:26

它返回单词BY 的错误,因为它认为您使用SORT 作为前一个表的表别名。

在 PDO 中,您可以通过在连接后 启用错误异常来实现:

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

如果不启用自动异常,则必须检查query()prepare()execute() 的返回值,如果出现错误则返回 FALSE。这在 Mysqli 和 PDO 中同样有效。


你的评论:

如果您的 SQL 正确,则 PDO 代码应该可以工作。但我会写得有点不同:

function read(){

    $query = "
        SELECT 
            *
        FROM
            `{$this->table_name}`
        ORDER BY OrderID ASC";

    $stmt = $this->conn->prepare($query);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

我假设您想使用与 Mysqli 代码中相同的 ORDER BY

在构建 SQL 查询时,我避免在 PHP 中使用字符串连接与 .。字符串连接太容易引入错误了。

我还会从这个函数返回获取的行,而不是语句,以使调用代码更容易。

【讨论】:

  • ...非常感谢。这修复了 mysqli 方法。
  • 出于个人成长的原因。如何使 PDO 方法发挥作用?
猜你喜欢
  • 2013-09-24
  • 2020-01-17
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
相关资源
最近更新 更多