Нужно переписать с sqlite на mysql

Discussion in 'PHP' started by Madnezz, 8 Dec 2010.

  1. Madnezz

    Madnezz New Member

    Joined:
    14 Feb 2010
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    Нашел интересный мне скрипт голосования, но он под sqlite, нужно переписать на MySql. Моих знаний не хватает =(
    Сам скрипт http://nettuts.s3.amazonaws.com/783_PHPPoll/demo.zip
    Очень надеюсь на вашу помощь.
     
  2. Madnezz

    Madnezz New Member

    Joined:
    14 Feb 2010
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    Пробую изменить webPoll.class.php на такой:
    Code:
    <?php
        # you don't display errors on in-use scripts, do you?
        ini_set('display_errors',0);
        error_reporting(E_ALL|E_STRICT);
    
    
    
    class webPoll {
    
        # makes some things more readable later
        const POLL = true;
        const VOTES = false;
    
        # number of pixels for 1% on display bars
        public $scale = 2;
        
        
        public $question = '';
        public $answers = array();
        private $header = '<form class="webPoll" method="post" action="%src%">
                           <input type="hidden" name="QID" value="%qid%" />
                           <h4>%question%</h4>
                           <fieldset><ul>';
        private $center = '';
        private $footer = "\n</ul></fieldset>%button%\n</form>\n";
        private $button = '<p class="buttons"><button type="submit" class="vote">Vote!</button></p>';
        private $md5 = '';
    
    /**
     * ---
     * Takes an array containing the question and list of answers as an
     * argument. Creates the HTML for either the poll or the results depending
     * on if the user has already voted
     */
    public function __construct($params) {
        $this->question = array_shift($params);
        $this->answers = $params;
        $this->md5 = md5($this->question);  
        
        $this->header = str_replace('%src%', $_SERVER['SCRIPT_NAME'], $this->header);
        $this->header = str_replace('%qid%', $this->md5, $this->header);
        $this->header = str_replace('%question%', $this->question, $this->header);
        
        # seperate cookie for each individual poll
        isset($_COOKIE[$this->md5]) ? $this->poll(self::VOTES) : $this->poll(self::POLL);    
    }
    private function poll($show_poll) {
        $replace = $show_poll ? $this->button : '';
        $this->footer = str_replace('%button%', $replace, $this->footer);
        
        # static function doesn't have access to instance variable
        if(!$show_poll) {
            $results = webPoll::getData($this->md5);
            $votes = array_sum($results);
        }
    
        for( $x=0; $x<count($this->answers); $x++ ) {
            $this->center .= $show_poll ? $this->pollLine($x) : $this->voteLine($this->answers[$x],$results[$x],$votes);
        }
        
        echo $this->header, $this->center, $this->footer;
    }
    private function pollLine($x) {
        isset($this->answers[$x+1]) ? $class = 'bordered' : $class = '';
        return "
        <li class='$class'>
                <label class='poll_active'>
                <input type='radio' name='AID' value='$x' />
                    {$this->answers[$x]}
                </label>
        </li>
    ";
    }
    private function voteLine($answer,$result,$votes) {
        $result = isset($result) ? $result : 0;
        $percent = round(($result/$votes)*100);
        $width = $percent * $this->scale;
        return "
        <li>
                <div class='result' style='width:{$width}px;'>&nbsp;</div>{$percent}%
                <label class='poll_results'>
                    $answer
                </label>
        </li>
    ";
    }
    /**
     * processes incoming votes. votes are identified in the database by a combination
     * of the question's MD5 hash, and the answer # ( an int 0 or greater ).
     */
    static function vote() {
        if(!isset($_POST['QID']) || !isset($_POST['AID']) || isset($_COOKIE[$_POST['QID']])) {
            return;
        }
        
        $dbh = new PDO ("mysql:dbname=poll;host=localhost","root", "321");
        $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    
        try {
            $sth = $dbh->prepare( "INSERT INTO tally (QID,AID,votes) values (:QID, :AID, 1)" );
            $sth->execute(array($_POST['QID'],$_POST['AID']));
        }
        catch(PDOException $e) {
            # 23000 error code means the key already exists, so UPDATE! 
            if($e->getCode() == 23000) {
                try {
                    $sth = $dbh->prepare( "UPDATE tally SET votes = votes+1 WHERE QID=:QID AND AID=:AID");
                    $sth->execute(array($_POST['QID'],$_POST['AID']));
                }
                catch(PDOException $e) {
                    webPoll::db_error($e->getMessage());
                }
            }
            else {
                webPoll::db_error($e->getMessage());
            }
        }
        
        # entry in $_COOKIE to signify the user has voted, if he has
        if($sth->rowCount() == 1) {
            setcookie($_POST['QID'], 1, time()+60*60*24*365);
            $_COOKIE[$_POST['QID']] = 1;
        }
    }
    static function getData($question_id) {
        try {
            $dbh = new PDO ("mysql:dbname=poll;host=localhost","root", "321");
            $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            
            $STH = $dbh->prepare('SELECT AID, votes FROM tally WHERE QID = ?');
            $STH->execute(array($question_id));
        }
        catch(PDOException $e) {  
            # Error getting data, just send empty data set
            return array(0); 
        }
        
        while($row = $STH->fetch()) {
            $results[$row['AID']] = $row['votes'];   
        }
        
        return $results;
    }
    /*
     * You can do something with the error message if you like. Email yourself
     * so you know something happened, or make an entry in a log
     */
    static function db_error($error) {   
        echo "A database error has occoured. $error";
        exit;
    }
    
    
    
    
    
    
    
        
        
        
        
        
    }
    
    
    ?>
    
    И выдает:
    A database error has occoured. SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

    Хотя база есть, таблица тоже
     
  3. Madnezz

    Madnezz New Member

    Joined:
    14 Feb 2010
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    Вопрос решен, тему можно закрыть