-2

我有一个基本表单,可以在每个框中加载 15 个具有相同主题的下拉框。这是一个投票页面,用户可以在其中为他最喜欢的主题或他最不喜欢的主题投票。我遇到的问题是,当我告诉他们时,主题没有被加载。这是我的代码。

PHP

<?php
$Vote = new Vote();

class Vote {

    public function GetTopic() {
        $Connect = new mysqli("127.0.0.1", "root", "", "Data");

        $Query = 'SELECT * FROM Topics';

        if($Gather = $Connect->query($Query))
        {
            while($Row = $Gather->fetch_assoc())
            {
                $Topic = $Row['Topic'];
                echo '<option>'.$Topic.'</option>';
            }

            $Gather->free();
        }
        else
        {
            echo 'Error';
        }

        $Connect->close();
    }

    public function LoadTopic() {
        for($I = 15; $I > 0; $I--)
        {
            echo '<select><option>'.$I.'</option>'.$this->GetTopic().'</select>';
        }
    }

}
?>
4

2 回答 2

0

让我们尝试一些更适合类的东西:

<?php

    class Vote
    {
        private $connect;

        public $topics = array();

        public function __construct()
        {
            $this->connect = new mysqli( '127.0.0.1', 'root', '', 'Data' );

            if( $this->connect->connect_errno )
            {
                echo "Error:(" . $this->connect->connect_errno . "): " . $this->connect->connect_error . ".";
            }
        }

        public function GetTopics()
        {
            $Query = 'SELECT * FROM Topics';

            if( $Gather = $this->connect->query( $Query ) )
            {
                while( $Row = $Gather->fetch_assoc() )
                {
                    $this->topics[] = $Row['Topic'];
                }
                $Gather->free();
            }
            else
            {
                echo 'Error';
            }
        }

        public function LoadTopics()
        {
            if( $max = count($this->topics) > 0 )
            {
                $html = "<select>\r\n";

                for( $i = 0; $i < $max; ++$i )
                {
                    $html .= "<option value=" . $i . ">" . $this->topics[$i] . "</option>";
                }
                $html .= "</select>\r\n";

                return $html;
            }
            else
            {
                return false;
            }
        }

        public function __destruct()
        {
            $this->connect->close();
        }
    }
?>

__construct() / __destruct() 方法实际上是用来建立连接的。您也可以组合这两个函数,只让GetTopics()方法(我强制更改一些方法和属性名称)运行查询,格式化结果并返回$html.

另外,我升级了您的for功能,如果您决定稍后在您的主题中添加另一个条目,它将随之扩展,而不是通过 15 个静态行计数。

您可以使用以下命令调用它:

<?php

    $vote = new Vote();

    echo $vote->GetTopics()->LoadTopics();
?>

我看到答案已经被选中,但不想浪费我的工作;D

备用GetTopics()功能,全部合二为一。

        public function GetTopics()
        {
            $Query = 'SELECT * FROM Topics';

            if( $Gather = $this->connect->query( $Query ) )
            {
                $html = "<select>\r\n";
                $i = 0;

                while( $Row = $Gather->fetch_assoc() )
                {
                    $html .= "<option value=" . $i . ">" . $Row['Topic'] . "</option>";
                    ++i;
                }
                $html .= "</select>\r\n";

                $Gather->free();

                return $html;
            }
            else
            {
                return "Error: No Results Returned";
            }
        }

现在它只是由以下方式调用:

<?php echo $vote->GetTopics(); ?>
于 2013-09-01T20:45:21.813 回答
0

如果你像这样使用你的函数,你应该返回你的 html-data 而不是输出它:

public function GetTopic() {
    $Connect = new mysqli("127.0.0.1", "root", "", "Data");

    $Query = 'SELECT * FROM Topics';

    if($Gather = $Connect->query($Query))
    {
        $html = "";
        while($Row = $Gather->fetch_assoc())
        {
            $Topic = $Row['Topic'];
            $html .= '<option>'.$Topic.'</option>';
        }
        $Gather->free();
        return $html;
    } else
    {
        //handle error
    }
    $Connect->close();
}
于 2013-09-01T20:13:47.753 回答