【问题标题】:Queries - putting them in a class?查询 - 将它们放在一个类中?
【发布时间】:2011-04-18 14:33:07
【问题描述】:

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

【问题讨论】:

  • 在此行添加双引号:echo $content."&lt;br/&gt; 此外,您不会从函数返回任何内容:selectTitles。 books.php 中$id_title 的值是多少?
  • 您好,观察者,id_title 应该由第一个查询返回...谢谢!
  • 我的意思是它没有被退回,你所做的只是回响。一旦该函数完成,$id_title 将不再设置。

标签: php sql


【解决方案1】:

我猜这里的范围界定是您的问题(只是快速浏览一下)。 $selected_titles 在您将所有查询内容提取到它自己的类之前就在范围内,但是一旦提取出来,它的范围就仅限于该类。一旦方法调用完成,该变量就会消失并且无法访问。更好的方法可能是使用返回值。根据返回数据的大小和访问数据的方式,您可能希望使用传递引用而不是传递值。

【讨论】:

  • 谢谢马蒂加贝!我将尝试研究如何做到这一点。
【解决方案2】:

错字?

WHERE booktitles.id_book = $book

应该有

WHERE booktitles.id_book = $id_book

【讨论】:

  • 谢谢 Szymon,book 是一个张贴值(实际上是 id,但你说得对,我可以找到更好的名字)!
【解决方案3】:

例如,我认为最好将两个查询合并为一个(我假设 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,以及是否在多个函数中使用相同的 SQL 语句次地点,我发现改变一次而不是多次改变生活更容易。虽然我发现如果你这样做,它有助于在你的项目中始终如一地使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多