mysqli и pdo возвращают 0, пока соединение работает успешно - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь получить доступ к следующей таблице с моего локального сервера mysql, размещенного в mamp. Я пробовал несколько подходов, но все они, кажется, дают один и тот же результат («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 сервер, который продолжает отвергать его?

1 Ответ

0 голосов
/ 04 сентября 2018

Вы используете

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-запросов. Для конкатенации строк слишком легко вводить ошибки.

Я бы также вернул извлеченные строки, а не оператор из этой функции, чтобы упростить вызывающий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...