我正在尝试从托管在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服务器不断拒绝它吗?
答案 0 :(得分:3)
您使用
/etc/rc.d/rc.local
在SQL中,语法应为:
nano /etc/rc.d/rc.local
请参见https://dev.mysql.com/doc/refman/8.0/en/select.html
在每次调用SORT BY
或ORDER BY
或query()
之后,您还应该检查错误情况。否则,使驱动程序在出现错误时引发异常。
在Mysqli中,您可以通过以下方式启用报告模式:在连接之前 :
prepare()
我测试了您的代码,并在启用异常时得到了此信息:
execute()
它返回单词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
作为上一张表的表别名。
在PDO中,您可以通过在连接后在错误 上启用异常来实现此目的:
BY
如果不启用自动异常,则必须检查SORT
和try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
和query()
的返回值,如果出现错误,它们将返回FALSE。在Mysqli和PDO中也是如此。
发表评论:
如果您正确使用了SQL,则PDO代码应该起作用。但是我会写得有些不同:
prepare()
我假设您要像在Mysqli代码中一样使用execute()
。
在构建SQL查询时,我避免在PHP中将字符串连接与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);
}
一起使用。字符串连接很容易引入错误。
我还将从此函数返回获取的行,而不是返回语句,以简化调用代码。