2011-04-18 90 views
1

我试图把我的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

在此行上添加双引号:'echo $ content。“
'此外,您还没有从函数返回任何内容:'selectTitles'。books.php中的$ id_title的值是什么? – 2011-04-18 14:36:10

+0

hi观察者, id_title应该由第一个查询返回...谢谢! – Raphael 2011-04-18 14:48:11

+0

我的观点是它没有被返回,你所做的只是回应。一旦这个函数完成,$ id_title不再被设置。 – 2011-04-18 14:56:04

回答

1

我猜作用域是你的问题在这里(只是看一眼)。 $selected_titles在将所有查询内容提取到它自己的类中之前处于范围之内,但是一旦它被提取出来,它的范围仅限于该类。方法调用完成后,该变量就消失了,无法访问。更好的方法可能是使用返回值。根据返回数据的大小以及访问数据的大小,您可能希望使用传递引用而不是按值传递。

+0

谢谢Mattygabe!我会试着研究如何做到这一点。 – Raphael 2011-04-18 14:41:20

0

错字?

WHERE booktitles.id_book = $book 

应该有

WHERE booktitles.id_book = $id_book 
+0

谢谢Szymon,book是一个已发布的值(实际上是id,但你是对的,我可以找到一个更好的名字) ! – Raphael 2011-04-18 14:43:30

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语句,并且只有o ne while while循环。

我认为让你的SQL在单独的函数或类中是合理的事情,这意味着如果你需要改变它,你就知道在哪里寻找你的SQL,以及如果你有相同的SQL语句用于我发现多次的地点让生活更容易一次而不是多次改变。虽然我发现如果你这样做,它有助于将它一致地用于你的项目。