我正在尝试将我的SQL查询放在一个单独的文件中,以便不会无休止地重复它们。我试图为此创建一个类和函数,但出了点问题。我无法弄清楚原因。我甚至怀疑这是否是继续进行的好方法,因为我在网上没有找到任何类似的例子。
我想获得的原始代码和结果是那些:
//this works but must be refactored
$book = $_POST['book'];
$select_titles = mysql_query("
SELECT booktitles.id_title, booktitles.title, booktitles.id_book
FROM booktitles
WHERE booktitles.id_book = $book
") or die(mysql_error());
while($selected_titles = mysql_fetch_assoc($select_titles))
{
$id_title = $selected_titles['id_title'];
$title = $selected_titles['title'];
echo $title."<br/>";
// now the second query, wich needs the $id_title
$select_content = mysql_query("
SELECT content.id_content, content.content, content.id_title
FROM content
WHERE content.id_title = $id_title
") or die(mysql_error());
while($selected_content = mysql_fetch_assoc($select_content))
{
$id_content = $selected_content['id_content'];
$content = $selected_content['content'];
echo $content."<br/>;
}
}
我尝试以这种方式对其进行转换(请注意,我不能像上一个示例中那样合并这两个查询,因为我必须能够单独访问它们):
// file : query.php
class Queries
{
public function selectTitles($id_book)
{
$select_titles = mysql_query("
SELECT booktitles.id_title, booktitles.title, booktitles.id_book
FROM booktitles
WHERE booktitles.id_book = $book
") or die(mysql_error());
while($selected_titles = mysql_fetch_assoc($select_titles))
{
$id_title = $selected_titles['id_title'];
$title = $selected_titles['title'];
echo $title."<br/>";
}
}
public function selectContent($id_title)
{
$select_content = mysql_query("
SELECT content.id_content, content.content, content.id_title
FROM content
WHERE content.id_title = $id_title
") or die(mysql_error());
while($selected_content = mysql_fetch_assoc($select_content))
{
$id_content = $selected_content['id_content'];
$content = $selected_content['content'];
echo $content."<br/>;
}
}
}
// file : books.php
require_once('query.php');
$book = $_POST['book'];
$display_titles = new Queries;
$display_titles->selectTitles($book);
while($id_title)
{
$display_content = new Queries;
$display_content->selectContent($id_title);
// this does not work. Furthermore, I must be able to add something here (like a form which uses the values) --> I seem not allowed to do that
}
这不起作用。任何关于如何处理这个的想法将非常感谢!
(注意:这是对类似问题的回答:modify php oop mysql query)
答案 0 :(得分:1)
我猜测范围是你的问题(只需快速浏览一下)。在将所有查询内容提取到自己的类中之前,$selected_titles
在范围内,但是一旦提取了它,它的范围仅限于该类。方法调用完成后,该变量就会消失,无法访问。更好的方法可能是使用返回值。根据返回的数据大小及其访问的内容,您可能希望使用pass-by-reference而不是pass-by-value。
答案 1 :(得分:0)
错字?
in
WHERE booktitles.id_book = $book
应该有
WHERE booktitles.id_book = $id_book
答案 2 :(得分:0)
我认为最好将两个查询合并为一个(我假设content.id_content是唯一的,行匹配)例如
SELECT booktitles.id_title, booktitles.title, booktitles.id_book, content.id_content, content.content
FROM booktitles
WHERE (booktitles.id_book = $book) AND (booktitles.id_title = content.id_title)
通过这种方式,您可以避免在while循环中使用SQL语句,并且只有一个while循环。
我认为将SQL放在单独的函数或类中是一件合理的事情,这意味着如果你需要更改它,你知道在哪里查找你的SQL,并且如果你有多个使用相同的SQL语句时间位置我觉得它让生活更容易改变一次而不是几次。虽然我发现如果你这样做,它有助于为你的项目一致地使用它。