我有一个Search page,用户可以根据特定条件进行搜索。我无法使查询正确显示只有一个所需的对象。这是我们的数据库设置:
CREATE TABLE Class
(
cid int NOT NULL,
classNum int,
classDept varchar(20),
PRIMARY KEY (cid)
);
CREATE TABLE Book
(
bid int NOT NULL,
cid int NOT NULL,
title varchar(20) NOT NULL,
author varchar(20) NOT NULL,
isbn varchar(13),
price decimal(5,2) NOT NULL,
PRIMARY KEY (bid),
FOREIGN KEY (cid) REFERENCES Class (cid)
);
CREATE TABLE Contact
(
contactID int NOT NULL,
fname varchar(20),
lname varchar(20),
contactInfo varchar(90) NOT NULL,
PRIMARY KEY (contactID)
);
CREATE TABLE Post
(
pid int NOT NULL,
contactID int NOT NULL,
bid int NOT NULL,
postDate date,
PRIMARY KEY (pid),
FOREIGN KEY (contactID) references Contact(contactID),
FOREIGN KEY (bid) references Book(bid)
);
这是我们用来尝试根据用户输入的条件进行查询的php代码。
$author = $_POST["author"];
$title = $_POST["title"];
$classNum = $_POST["number"];
$classDept = $_POST["department"];
$isbn = $_POST["isbn"];
$query = "SELECT title, author, isbn, price, classNum, classDept, contactInfo
FROM Book, Class, Contact, Post
WHERE
Book.author='$author'
OR Book.title='$title'
AND (SELECT Book.bid FROM Book, Contact WHERE Book.cid=Class.cid AND Contact.contactID=Post.ContactID AND Book.bid=Post.bid";
$stid = oci_parse($conn,$query);
oci_execute($stid,OCI_DEFAULT);
我们做错了什么?我们如何才能显示正确的搜索结果?
答案 0 :(得分:1)
您的样本中存在一些错误。首先,您将AND
和OR
混合在一起,不带括号,这可能会导致令人惊讶的结果。其次,您缺少外部查询中的join子句,第三,您的子查询没有匹配的右括号。
以下是我认为您可能想要完成的查询。注意我使用了ANSI连接语法。您可以将其切换为“Oracle”样式语法,它将完全相同。但是,我建议学习ANSI方法,因为这样可以更容易理解任何外连接。
SELECT title, author, isbn, price, classNum, classDept, contactInfo
FROM Book
JOIN Class
ON Class.cid = Book.cid
JOIN Post
ON Post.bid = Book.bid
JOIN Contact
ON Contact.contactID = Post.contactID
WHERE Book.author = '$author'
OR Book.title = '$title';
最后,要将作者或标题放入查询中,您应该研究查询参数。我没有PHP的经验,所以我不能建议如何继续这个客户端。它应该是直截了当的。作为捷径,您可以将值直接连接到查询中。但是,对于任何严肃的实际项目,不建议这样做,因为您将容易受到SQL-injection attacks的攻击。</ p>