count=count+1 PDO

Godstyle

Erfahrenes Mitglied
Hallo und guten Abend,

folgendes Problem, ich habe gegoogelt und meine Lösung gefunden nur klappt es nicht, sprich er macht nichts, erstmal das script mit # ist mein altes mysql script versehen welches auch funktioniert, das PDO jedoch nicht.

PHP:
#$query = "UPDATE $table SET count=count+1 WHERE url=$safe_url" ;
$sql = 'UPDATE '.$table.' 
			SET 
				`count` = `count`+1 
			WHERE 
				`url`= '.$safe_url;
	$stmt = $pdo->prepare($sql);
	$count = $pdo->exec($sql);
	echo $count;
	if(!$stmt->execute()) {
		$err_msg = "Es trat ein unerwarteter Fehler auf!";
		return;
	}

echo $count gibt mir immer 0 zurück und auch in der DB ändert sich nichts.

Ziel des scripts ist es das falls die URL bereits eingetragen ist soll der counter +1 gesetzt werden, später prüfe ich mit $count == 0 ob kein Datensatz geändert wurde und dann wird er angelegt. Script bereits geschrieben aber hier irrelevant.

lg
 
Geht viel einfacher.
Setze einen eindeutigen Index auf das Feld url (UNIQUE INDEX).
Dann kannst du mit INSERT ... ON DUBLICATE ... arbeiten
SQL:
INSERT INTO `{$table}` (`url`, `count`) 
VALUES ('{$safe_url}', 0)
ON DUPLICATE KEY 
UPDATE `count` = `count`+1 ;
 
Zuletzt bearbeitet von einem Moderator:
guten morgen und vielen Danke, nur scheint dies in meinem Fall aus einem mir nicht erklärlichen Grund nicht zu klappen.

Aktuell sieht das script komplett wie folgt aus:

PHP:
<?php
if(isset($_SESSION['user'])) {
$url = "http://" .$_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'].'?'. $_SERVER['QUERY_STRING'];  
 
$table = "page_view";

$safe_url = "'" . mysql_real_escape_string( $url ) . "'";
 

#$query = "UPDATE $table SET count=count+1 WHERE url=$safe_url" ;
$sql = "INSERT INTO `{$table}` (`url`, `count`) 
VALUES ('{$safe_url}', 0)
ON DUPLICATE KEY 
UPDATE `count` = `count`+1 ";
	$stmt = $pdo->prepare($sql);
	$count = $pdo->exec($sql);
	echo $count;
	if(!$stmt->execute()) {
		$err_msg = "Es trat ein unerwarteter Fehler auf!";
		return;
	}
}

Fehler ist:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'http://localhost/index.php?kat1=com&kat2=meinbereich'', 0) ON DUPLICATE KEY U' at line 2'

Habe die tabelle zuvor komplett geleert und count auf unique gesetzt.
 
Zuletzt bearbeitet:
Warum soll count ein Feld mit eindeutigem Wert sein? Der Zähler kann doch bei verschiedenen URLs gleich hoch sein!

Andere Frage:
Warum hast du einmal $count und dann auch noch $stmt im Einsatz. Ich habe die erste Abfrage mit leichter Änderung bei mir ausgeführt (restlicher Code wie von dir vorgegeben) und da wurde der Zähler immer um den Wert 2 erhöht!?
 
Aufgrund der aussage von Yaslow:
Setze einen eindeutigen Index auf das Feld url (UNIQUE INDEX).

Es ist richtig das es auch mehrere mit selbem count gibt und es war ein Fehler den ich in der Aussage gemacht habe, url ist unique und nicht count.

Ich habe ja selbst die mysql sache noch drinnen mit # damit sie nicht genutzt wird, und diese funktioniert auch.


// EDIT mit stmt stimme ich dir vollkommen zu, habe es nun auch rausgenommen, ändert jedoch nichts
 
Zuletzt bearbeitet:
Ok, dann war das mit count ein Schreibfehler und ist entschuldigt ;-)

Lasse dir mal mit echo den Inhalt von der Variable $sql am Bildschirm ausgeben (oder zeig uns was da rauskommt) und teste diesen in phpMyAdmin o.ä., dort bekommst du vielleicht eine bessere Fehlermeldung.
 
sql auggabe:

PHP:
INSERT INTO `page_view` (`url`, `count`) VALUES (''http://localhost/index.php?kat1=com&kat2=meinbereich'', 0) ON DUPLICATE KEY UPDATE `count` = `count`+1

Fehlermeldung komplett:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'http://localhost/index.php?kat1=com&kat2=meinbereich'', 0) ON DUPLICATE KEY U' at line 2' in C:\xampp\htdocs\include\page_views.php:16 Stack trace: #0 C:\xampp\htdocs\include\page_views.php(16): PDO->exec('INSERT INTO `pa...') #1 C:\xampp\htdocs\index.php(9): require_once('C:\xampp\htdocs...') #2 {main} thrown in C:\xampp\htdocs\include\page_views.php on line 16

phpmyadmin:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'http://localhost/index.php?kat1=com&kat2=meinbereich'', 0) ON DUPLICATE KEY UPDA' at line 1
 
Ok erledigt, die sql ausgabe hier im Forum hat mir dann den Fehler gezeigt, ich habe die doppelten ' entfernt in der declaration von safe_url und nun geht es. vielen dank
 
Sieht so aus als ob du zu viele einfache Anführungszeichen in der SQL Anweisung hättest.

Zuerst hier
PHP:
$safe_url = "'" . mysql_real_escape_string( $url ) . "'";

und dann noch hier
PHP:
VALUES ('{$safe_url}', 0)

Das dprfte dein Problem sein!
 
Zurück