mysqli和pdo在连接成功时返回0

vcirk6k6  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(360)

我试图从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服务器一直拒绝它吗?

slsn1g29

slsn1g291#

你用

SORT BY

在sql中,语法应为:

ORDER BY

看到了吗https://dev.mysql.com/doc/refman/8.0/en/select.html
您还应该在每次调用 query() 或者 prepare() 或者 execute() . 或者让驱动程序在出现错误时抛出异常。
在mysqli中,您可以在连接之前启用报告模式:

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);
}

我猜你想用 ORDER BY 与mysqli代码相同。
我避免使用字符串连接 . 在php中生成sql查询时。字符串串联太容易导致错误。
我还将从这个函数返回获取的行,而不是语句,以使调用代码更容易。

相关问题