Малко помощ за пренаписване на скрипт с PDO

vinsbg

Registered
Здравейте,
хванах се да пренапиша едно скриптче за гласуване. Явно нещо не е както трябва, защото нищо не записва в базата данни :) Моля за малко помощ.

Това е оригиналната част
Код:
<?php
if(!empty($_POST["image_id"])) {
require_once("dbcontroller.php");
$db_handle = new DBController();
	$query = "INSERT INTO ipaddress_vote_map (ip_address,image_id,vote_rank) VALUES ('" . $_SERVER['REMOTE_ADDR'] . "','" . $_POST["image_id"] . "','" . $_POST["vote_rank"] . "')";
	$result = $db_handle->insertQuery($query);

	if(!empty($result)) {
		$query = "SELECT SUM(vote_rank) as vote_rank FROM ipaddress_vote_map  WHERE image_id = '" . $_POST["image_id"] . "' and ip_address = '" . $_SERVER['REMOTE_ADDR'] . "'";
		$row = $db_handle->runQuery($query);
		
		switch($_POST["vote_rank"]) {
			case "1":
				$update_query ="UPDATE images SET votes = votes+1 WHERE image_id='" . $_POST["image_id"] . "'";
			break;
			case "-1":
				$update_query ="UPDATE images SET votes = votes-1 WHERE image_id='" . $_POST["image_id"] . "'";
			break;
		}
		
		$result = $db_handle->updateQuery($update_query);	
		print $row[0]["vote_rank"];
	}
}
?>
А това е моето творение
Код:
if(!empty($_POST["image_id"])) {
    include 'misc/database.inc.php';
    error_reporting(E_ALL); 
    ini_set('display_errors', 1);
    $pdo = Database::connect();   
    
    $query = $pdo -> prepare("INSERT INTO ipaddress_vote_map (ip_address,image_id,vote_rank) 
                              VALUES (:remote_address, :image_id, :vote_rank)");    
    $query -> execute(array(
                        "remote_address"    => $_SERVER['REMOTE_ADDR'],
                        "image_id"          => $_POST['image_id'],
                        "vote_rank"         => $_SERVER['vote_rank']
    ));    
    
    if($query->rowCount() > 0) {
        $query = $pdo -> prepare("SELECT SUM(vote_rank) as vote_rank FROM ipaddress_vote_map  WHERE image_id = :image_id and ip_address = :remote_address");
        $query -> execute(array(
                "remote_address"    => $_SERVER['REMOTE_ADDR'],
                "image_id"          => $_POST['image_id']                
        ));
        
        switch($_POST['vote_rank']){
            case '1':
            $update_query = $pdo -> prepare("UPDATE images SET votes = votes+1 WHERE image_id= :image_id");
            $update_query -> execute(array(
                'image_id' => $_POST['image_id']
            ));
            break;
            case '-1':
            $update_query = $pdo -> prepare("UPDATE images SET votes = votes-1 WHERE image_id= :image_id");
            $update_query -> execute(array(
                'image_id' => $_POST['image_id']
            ));
            break;            
        }
        //$result = $pdo->updateQuery($update_query);	
        $query->rowCount();
		print $row[0]["vote_rank"];
    }
    Database::disconnect();    
}
Не виждам и никакви грешки...
 
mapka7a каза:
VALUES (:remote_address, :image_id, :vote_rank)"

никъде не виждаме реално да биндваш параметрите


http://php.net/manual/en/pdostatement.bindparam.php
Веднага след това :idea:
Код:
 $query -> execute(array(
                        "remote_address"    => $_SERVER['REMOTE_ADDR'],
                        "image_id"          => $_POST['image_id'],
                        "vote_rank"         => $_SERVER['vote_rank']
    ));

п.п.
Май съм се заблудил нещо, че по този начин ги биндвам...
 
Е прави си го със съкратения синтактис:

[sql]$query -> execute(array(
"remote_address" => $_SERVER['REMOTE_ADDR'],
"image_id" => $_POST['image_id'],
"vote_rank" => $_SERVER['vote_rank']
)); [/sql]

Добре е да се пуснат съобщенията за грешките да се види какво точно се случва, че така малко...
 
vinsbg каза:
mapka7a каза:
VALUES (:remote_address, :image_id, :vote_rank)"

никъде не виждаме реално да биндваш параметрите


http://php.net/manual/en/pdostatement.bindparam.php
Веднага след това :idea:
Код:
 $query -> execute(array(
                        "remote_address"    => $_SERVER['REMOTE_ADDR'],
                        "image_id"          => $_POST['image_id'],
                        "vote_rank"         => $_SERVER['vote_rank']
    ));

п.п.
Май съм се заблудил нещо, че по този начин ги биндвам...

Идиот съм, кво да ти кажа :D

виж си заявката като цяло с debugDumpParams дали изкарва нещо и я пусни в phpmyadmin,може също и да погледнеш и еррорлога ако има нещо там записано
 
Заявката в phpmyadmin-a си минава:
Код:
INSERT INTO `ipaddress_vote_map` ( `id` , `image_id` , `ip_address` , `vote_rank` )
VALUES (
'', '11', '127.0.0.1', '1'
)

С първия пример ...
Код:
if(!empty($_POST["image_id"])) {
require_once("dbcontroller.php");
$db_handle = new DBController();
   $query = "INSERT INTO ipaddress_vote_map (ip_address,image_id,vote_rank) VALUES ('" . $_SERVER['REMOTE_ADDR'] . "','" . $_POST["image_id"] . "','" . $_POST["vote_rank"] . "')";
   $result = $db_handle->insertQuery($query); 
.....
Също си работи коректно. Но по моя начин, както съм го пренаписал не иска.
 
Я си дай и самият клас.

PHP:
$query = $pdo -> prepare("INSERT INTO ipaddress_vote_map (ip_address,image_id,vote_rank)
                              VALUES (?, ?, ?)");   
    $query -> execute(array($_SERVER['REMOTE_ADDR'],$_POST['image_id'],$_SERVER['vote_rank']));
 
Но няма да мине, ако някоя от променливите ти върне null, а в същото време съответното поле в базата е not null. Взимаш данните директно от глобалните масиви, но няма гаранция, че има такива елементи. Може да не е това проблема, но като цяло е лош стил. Добре да си инициализираш валидирани променливи преди заявката и да работиш с тях...
 
vinsbg каза:
dakata__92 каза:
Я си дай и самият клас.
...

кой клас? Това е всичко, което съм дал..
Та ти правиш някаква конекция към метод $pdo = Database::connect(); който трябва да ти върне обекта. Сега го хардкорнах $pdo = new \PDO("mysql:host=localhost;dbname=test",'root',''); настрой и пробвай.
PHP:
<?
	
if(!empty($_POST["image_id"])) {
    include 'misc/database.inc.php';
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    $pdo = new \PDO("mysql:host=localhost;dbname=test",'root','');   
   
    $query = $pdo -> prepare("INSERT INTO ipaddress_vote_map (ip_address,image_id,vote_rank)
                              VALUES (:remote_address, :image_id, :vote_rank)");   
    $query -> execute(array(
                        "remote_address"    => $_SERVER['REMOTE_ADDR'],
                        "image_id"          => $_POST['image_id'],
                        "vote_rank"         => $_SERVER['vote_rank']
    ));   
   
    if($query->rowCount() > 0) {
        $query = $pdo -> prepare("SELECT SUM(vote_rank) as vote_rank FROM ipaddress_vote_map  WHERE image_id = :image_id and ip_address = :remote_address");
        $query -> execute(array(
                "remote_address"    => $_SERVER['REMOTE_ADDR'],
                "image_id"          => $_POST['image_id']               
        ));
       
        switch($_POST['vote_rank']){
            case '1':
            $update_query = $pdo -> prepare("UPDATE images SET votes = votes+1 WHERE image_id= :image_id");
            $update_query -> execute(array(
                'image_id' => $_POST['image_id']
            ));
            break;
            case '-1':
            $update_query = $pdo -> prepare("UPDATE images SET votes = votes-1 WHERE image_id= :image_id");
            $update_query -> execute(array(
                'image_id' => $_POST['image_id']
            ));
            break;           
        }
        //$result = $pdo->updateQuery($update_query);   
        $query->rowCount();
      print $row[0]["vote_rank"];
    }
    $pdo = null;   
}
 
Не мисля, че е от конекцията, защото в други файлове няма проблеми и си работят.
Код:
class Database
{
    private static $dbName = 'image';
    private static $dbHost = 'localhost';
    private static $dbUsername = 'user';
    private static $dbUserPassword = 'pass';
     
    private static $cont  = null;

    public function __construct() {
        die('Init function is not allowed');
    }
     
    public static function connect()
    {
       // One connection through whole application
       if ( null == self::$cont )
       {     
        try
        {
          self::$cont =  new PDO( "mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); 
        }
        catch(PDOException $e)
        {
          die($e->getMessage()); 
        }
       }
       return self::$cont;
    }
     
    public static function disconnect()
    {
        self::$cont = null;
    }
    
}
 
Абе хора, големи сте заплеси :D:D
Забравили сте двоеточието в execute-то :D

$query -> execute(array(
":remote_address" => $_SERVER['REMOTE_ADDR'],
":image_id" => $_POST['image_id'],
":vote_rank" => $_SERVER['vote_rank']
));

http://stackoverflow.com/q/9778887
 
anonimen каза:
Абе хора, големи сте заплеси :D:D
Забравили сте двоеточието в execute-то :D

$query -> execute(array(
":remote_address" => $_SERVER['REMOTE_ADDR'],
":image_id" => $_POST['image_id'],
":vote_rank" => $_SERVER['vote_rank']
));

http://stackoverflow.com/q/9778887
:D :D
Това добре.. но все така не иска да инсертва в базата нищо. Това се изпълнява от ajax-a и не знам как точно мога да видя дали и какви грешки връща?
 
anonimen каза:
Абе хора, големи сте заплеси :D:D
Забравили сте двоеточието в execute-то :D

$query -> execute(array(
":remote_address" => $_SERVER['REMOTE_ADDR'],
":image_id" => $_POST['image_id'],
":vote_rank" => $_SERVER['vote_rank']
));

http://stackoverflow.com/q/9778887


ка'и честно :D

@vinsbg - от конзолата , при хром в network таба,
каза че ползваш ajax, значи би тряабвало и да ползваш success и error методите. Сложи им по един console.log(), па може и да покаже нещо в конзолата
 
Нищо няма от лога в конзолата вече... оправих 2-те дребни грешки .. основния остава
 
Сложи тва веднага след конекцията и виж за грешки:

PHP:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
anonimen каза:
Сложи тва веднага след конекцията и виж за грешки:

PHP:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Извинявай, но как да видя изобщо ако излиза някаква грешка? В смисъл аз във файл index.php натискам бутона за гласуване и не виждам изобщо какво се случва в add_vote.php..

То реално предполагам, че това е и основния проблем.. то ако можеше да се види някаква грешка вече да е оправено предполагам... :)
 
vinsbg каза:
Извинявай, но как да видя изобщо ако излиза някаква грешка? В смисъл аз във файл index.php натискам бутона за гласуване и не виждам изобщо какво се случва в add_vote.php..

То реално предполагам, че това е и основния проблем.. то ако можеше да се види някаква грешка вече да е оправено предполагам... :)
:shock: :shock: :shock: :shock: :shock: :shock:
Are you serious??
Не можеш да си решиш проблема защото не виждаш output-а?
Отвори конзолата, с десен бутон, после цъкваш "log xmlhttprequests"
И така всеки рекуест ще ти излиза с хедъри и съдържание и всичко...

п.п. вариант 2 е да ползваш alert(data.responseText);
но е по-удобно от конзолата да ги гледаш. :?:
 
anonimen каза:
vinsbg каза:
Извинявай, но как да видя изобщо ако излиза някаква грешка? В смисъл аз във файл index.php натискам бутона за гласуване и не виждам изобщо какво се случва в add_vote.php..

То реално предполагам, че това е и основния проблем.. то ако можеше да се види някаква грешка вече да е оправено предполагам... :)
:shock: :shock: :shock: :shock: :shock: :shock:
Are you serious??
Не можеш да си решиш проблема защото не виждаш output-а?
Отвори конзолата, с десен бутон "log xmlhttprequests"
И така всеки рекуест ще ти излиза с хедъри и съдържание и всичко...
Нищо няма в конзолата... както казах само това излиза
Код:
POST XHR  http://localhost/add_vote.php [HTTP/1.1 200 OK 1ms]
GET http://localhost/loaderIcon.gif [HTTP/1.1 304 Not Modified 0ms]
 

Back
Горе