avery avery - 6 months ago 12
MySQL Question

error in mysql syntax limit -1,1

I am a beginner in coding so probably my code does not look that nice but at first I just want to try to get it working.

I have an error with my limit argument I think but I don't know how to fix it

Can you provide some help please?

<?php

require_once ("config.inc.php");

try {
$db = new PDO ($dsn,$user,$passw);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
die ("Fehler im System");
}


# Blätterfunktion


$sql_anzahl = "SELECT COUNT(*) as 'total' FROM news";


$query2 = $db->query($sql_anzahl);
$anzahl_total = $query2->fetch();

echo $anzahl_total ['total'];
echo "<br><br>";


$eintrag_gesamt = $anzahl_total['total']; //Gesamtanzahl als Variable
$pro_seite = 1; // Einträge pro Seite
$seiten_gesamt = $eintrag_gesamt/$pro_seite; // wie viele Seiten gibt es insgesamt

echo $seiten_gesamt. "<br><br>";

# auf welcher Seite

$page = (int)$_GET['page'];

if(!isset($page))
{
$page = 1;
}
else if ($page > $seiten_gesamt)
{
$page = 1;
}
else
{
$page = (int)$_GET['page'];
}

echo $page;
echo "<br><br>";

# wo anfangen zu zählen

$limit = ($page*$seiten_gesamt)-$pro_seite;




#news
$sql = "SELECT * FROM news ORDER BY ID DESC LIMIT $limit,$pro_seite";



$query = $db->query($sql);

while($r = $query->fetch()) {

echo nl2br($r['Text']), '<br><br>';

}

?>


error is

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 '-1,1' at line 1' in /www/htdocs/desktop/datenbank/pdo.php:65 Stack trace: #0 /www/htdocs/desktop/datenbank/pdo2.php(65): PDO->query('SELECT * FROM n...') #1 {main} thrown in /www/htdocs/w01034b5/datenbank/pdo.php on line 65


I thought that I could solve the problem '-1,1' if I do some more entries in my database but that was not a solution :(

I am using mysql database. I am not sure what you meaning exactly regarding the offset function since I am giving 2 arguments here.

I've compared with usage of limit section on mysql documentation.
http://dev.mysql.com/doc/refman/5.7/en/select.html

Answer

You compute the limit values wrong - your code (german to english!)

 ($page * $pages_overall) - $itemsPerPage;

Correct

$limit = (($page - 1) * $itemsPerPage) . ',' . $itemsPerPage;

Updated your code

<?php

require_once("config.inc.php");

try {
    $db = new PDO ($dsn, $user, $passw);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die ("Fehler im System");
}

# Blätterfunktion
$sql_anzahl = "SELECT COUNT(*) as 'total' FROM news";

$query2 = $db->query($sql_anzahl);
$anzahl_total = $query2->fetch();

echo $anzahl_total['total'];
echo "<br><br>";

// Gesamtanzahl als Variable
$eintrag_gesamt = $anzahl_total['total'];
// Einträge pro Seite
$pro_seite = 1;
// wie viele Seiten gibt es insgesamt
$seiten_gesamt = ceil($eintrag_gesamt / $pro_seite); // TODO immer auf nächste ganzzahl gehen mit ceil() verstehst du warum?

echo $seiten_gesamt . "<br><br>";

# auf welcher Seite

// TODO das bringt nichts, somit kann ein isset() darunter niemals greifen weil $page = 0
//$page = (int) $_GET['page'];
$page = (isset($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 1);
$page = ($page > $seiten_gesamt ? 1 : $page);

// TODO überflüssig siehst du selber oder?
/*
if (!isset($page)) {
    $page = 1;
} else if ($page > $seiten_gesamt) {
    $page = 1;
} else {
    $page = (int) $_GET['page'];
}
*/

echo $page;
echo "<br><br>";

# wo anfangen zu zählen

// TODO das kann nicht funktionieren
//$limit = ($page * $seiten_gesamt) - $pro_seite;

$limit = (($page - 1) * $pro_seite) . ',' . $pro_seite;
// TODO gehen wir es mal durch...
// Seite1: 0*1 = 0 ... LIMIT 0,1
// Seite2: 1*1 = 0 ... LIMIT 1,1
// Seite3: 2*1 = 0 ... LIMIT 2,1

#news
$sql = "SELECT * FROM news ORDER BY ID DESC LIMIT $limit,$pro_seite";

$query = $db->query($sql);
while ($r = $query->fetch()) {
    echo nl2br($r['Text']), '<br><br>';
}

?>

I hope it is okay for stackoverflow so write some helping comments in german...