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

Аа не извинявай, аз по памет ти казвам, сетих се, аз правех друго:
В javascript-a веднага във callback функцията слагаш
[js]console.log(data);[/js]

и ще ти излизат :?:
 
Май има напредък :D С лога сега това излезе в конзолата...
Код:
"<br />
<b>Notice</b>:  Undefined index: vote_rank in <b>/var/www/html/add_vote.php</b> on line <b>13</b><br />
<br />
<b>Fatal error</b>:  Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'vote_rank' cannot be null' in /var/www/html/add_vote.php:14
Stack trace:
#0 /var/www/html/fun/add_vote.php(14): PDOStatement->execute(Array)
#1 {main}
  thrown in <b>/var/www/html/add_vote.php</b> on line <b>14</b><br />
 
vinsbg каза:
Май има напредък :D С лога сега това излезе в конзолата...
Код:
"<br />
<b>Notice</b>:  Undefined index: vote_rank in <b>/var/www/html/add_vote.php</b> on line <b>13</b><br />
<br />
<b>Fatal error</b>:  Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'vote_rank' cannot be null' in /var/www/html/add_vote.php:14
Stack trace:
#0 /var/www/html/fun/add_vote.php(14): PDOStatement->execute(Array)
#1 {main}
  thrown in <b>/var/www/html/add_vote.php</b> on line <b>14</b><br />
Ееее така е много по-добре! Какво е тва дебъгване без да знаеш грешките! vinsbg, съветвам те да го запомниш това, защото погледни колко мнения се изписаха за едното нищо - ако беше дал грешката в поста, щяха да са излишни :)
Сега предполагам вече оправи проблема?

+ още един съвет - при грешки които получаваш с ajax, ползвай
PHP:
ini_set('html_errors', 0);
по този начин ще се махнат html таговете и по-лесно ще четеш грешките :?:
 
За съжаление понеже съм доста позаспал днес забравих да си кача файловете онлайн и сега ги нямам на РС-то на което съм в момента и останаха на друго. Сега предполагам, след като знам грешката ще ми е по-лесно да го оправя..
Утре ще пиша за резултата :?:
 
vinsbg каза:
За съжаление понеже съм доста позаспал днес забравих да си кача файловете онлайн и сега ги нямам на РС-то на което съм в момента и останаха на друго. Сега предполагам, след като знам грешката ще ми е по-лесно да го оправя..
Утре ще пиша за резултата :?:
Ок явно не си съвсем разбрал - както ясно е написано Undefined index: vote_rank, което очевидно се отнася за $_SERVER['vote_rank'], което очевидно трябва да е $_POST['vote_rank']
typo, сбъркал си $_ПОСТ със $_SERVER, просто за следващия път си активирай грешките :) :?:

Поне с 24 мнения в темата решението се намери :D
 
lamerko каза:
Column 'vote_rank' cannot be null'

И все пак излязох прав в предположенията :)
Да, но нали тук проблемът идва от там, че $_SERVER['vote_rank'] е null, а като се оправи на $_POST в конкретния случай вероятно ще тръгне.

Но наистина си прав, че трябва да се проверява още в началото поне за съществуването и не-празнотата на всички входове.

if(empty($_POST['vote_rank'] || !is_numeric($_POST['vote_rank'])) {
die('bad data');
}
 
Аз разбрах и благодаря за помощта.. просто казах, че в момента няма как да го оправя и пробвам.

А относно грешките съм много много начално ниво с ajax, като цяло и нямах представа как мога да ги виждам тези неща. Сега вече знам и мисля, че ще е по-лесно и с 'по-малко' коментари в темите :) :?: Поне се заформят хубави дискусии :)
 
Е, аз ко писах :)

lamerko каза:
Но няма да мине, ако някоя от променливите ти върне null, а в същото време съответното поле в базата е not null. Взимаш данните директно от глобалните масиви, но няма гаранция, че има такива елементи. Може да не е това проблема, но като цяло е лош стил. Добре да си инициализираш валидирани променливи преди заявката и да работиш с тях...
 
След промяната на $_SERVER['vote_rank'] с $_POST['vote_rank'] се оправи. Последно обаче, което не ми е ясно как ще стане:

Тъй като в оригиналния сорс има:
Код:
$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)) {
....
$result = $db_handle->updateQuery($update_query);	
		print $row[0]["vote_rank"];
а аз съм го направил
Код:
$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"         => $_POST['vote_rank']
    ));    
    
    if($query->rowCount() > 0) {
....
$query->rowCount();	        
		print $row[0]["vote_rank"];
логично дава грешка, че $row e Undefined variable.. Как мога да го оправя?
Хм .. аз като цяло нещо не го виждам това $row от къде ми се появява ... виждам, че идва от тук, което се предава със заявката към ajax-a
Код:
$ip_address = $_SERVER['REMOTE_ADDR'];            
       
       $vote_rank = 0;
       $query = $pdo->prepare("SELECT SUM(vote_rank) as vote_rank FROM ipaddress_vote_map WHERE image_id = :image_id and ip_address = :ip_address");
       $query -> bindParam(':image_id', $_GET['image_id'], PDO::PARAM_INT);
       $query -> bindParam(':ip_address', $ip_address, PDO::PARAM_INT); 
       $row = $query->execute();

       $up = "";
       $down = "";

       if(!empty($row[0]["vote_rank"])) {
           $vote_rank = $row[0]["vote_rank"];
           if($vote_rank == -1) {
               $up = "enabled";
               $down = "disabled";
           }
           if($vote_rank == 1) {
               $up = "disabled";
               $down = "enabled";
           }
       }
Нещо не мога да го схвана, реално вече работи и записва в базата, но това ме дразни, като notice в конзолата.
 
PDO работи (разбира се) по малко по-различен начин:

PHP:
$pdo = new PDO('....');

$stmt = $pdo->prepare('select....');
$stmt->execute([':param1' => 'value1']);
$stmt->setFetchMode(PDO::FETCH_NUM);

$row = $stmt->fetch();
var_dump($row);
Демек $row не идва от execute, а от $stmt->fetch()
+ обърни внимание, че резултатът от excute-to не го запазвам никъде, защото execute() връща bool.
 
А това правилно ли е така написано? Работи нормално и виждам, какво е натиснато, но правилно ли е? Или просто да махна array-а и да оставя директно print $row['vote_rank']; защото ми се струва, че няма смисъл от арая?

Код:
$row = $query->fetch();	     
$row = array("vote_rank" => $_POST['vote_rank']);
print $row["vote_rank"];
Другото го оправих. Благодаря :?:

едит:
То даже като го гледам това .. не виждам и много смисъл от него. Просто връща натиснатия бутон '1' или '-1' и то само в конзолата го виждам :idea: :shock:
 
Честно казано си нямам идея какво искаш да направиш, само ти давам напътствия къде може да си сбъркал. Но това определено е безсмислено:

PHP:
$row = $query->fetch();        
$row = array("vote_rank" => $_POST['vote_rank']);
print $row["vote_rank"];

Само помисли малко и ще видиш какво прави :)
 
anonimen каза:
Честно казано си нямам идея какво искаш да направиш, само ти давам напътствия къде може да си сбъркал. Но това определено е безсмислено:

PHP:
$row = $query->fetch();        
$row = array("vote_rank" => $_POST['vote_rank']);
print $row["vote_rank"];

Само помисли малко и ще видиш какво прави :)
Прави следното:

Когато се натисне +1, записва в таблицата id-то на снимката, ip-адреса и стойноста (+1) и така не може да се натисне +1 втори път. Съответно -1 е аналогично.

Ако го изтрия - записва в базата, но може да се +1 колкото си пъти искаш. Мисля, че споменах някъде, но ако не съм сега ще го направя, че това цялото не съм го писал аз от нулата, а от един туториал.. и малко го преработвам и нагаждам към моята страница.
 
И какво се предполага, че този фрагмент от кода трябва да прави?
 
Както написах:
Ако го изтрия - продължава да си записва в базата, но може да се вотва неограничено ... колкото си пъти искаш.
Както и да е. Проблема за който беше цялата тази тема е оправен и благодаря за помощта. За съжаление обаче не мога да дам на всички + :(
 

Back
Горе