Zur Navigation

SQL Abfrage mittels PDO

1 tobi

Hallo,

aktuell schaut dies so aus:
$sql = "SELECT * FROM (
SELECT id, nachname, vorname, verein, ttr, timestamp FROM anmeldungen_2017_sonntag WHERE gemeldeteKlasse = '3' ORDER BY timestamp ASC LIMIT 64
) as daten
ORDER BY timestamp DESC";

Ich würde dies gerne mittels PDO haben. Passt dies soweit?
$pdo_1 = new MyPDO();
$sql_1 = "
    SELECT
        id, nachname, vorname, verein, ttr,
        timestamp
    FROM
        anmeldungen_2017_sonntag
    WHERE
        gemeldeteKlasse = '3'
    ORDER BY
        timestamp ASC LIMIT 64 as daten
    ORDER BY
        timestamp DESC
";
Gruß

13.03.2018 10:22

2 Jörg

Du baust da ja keine Variablen ein, von daher kannst du $sql_1 doch genauso definieren wie $sql.

Das doppelte ORDER BY in einer Query wird wohl nicht den gleichen Effekt haben wie das getrennte ORDER BY in Haupt- und Sub-Query (aber wahrscheinlich wird der SQL-Server schon wegen der Reihenfolge ORDER BY, LIMIT, ORDER BY meckern)

13.03.2018 11:02 | geändert: 13.03.2018 11:06

3 tobi

In der Tat meckert er ...
Something went wrong...
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') as daten ORDER BY timestamp DESC' at line 9

13.03.2018 11:07

4 tobi

Moin,

ich kann auch ganz ausholen ;)

So ist es aktuell.
<?php

// Datenbank verbinden
include "../zugang_ppc.php.inc";

// Hole die 64 ältesten Datensätze der Klasse 2 ab und sortiere dann absteigend nach Datum (neueste zuerst)
$sql = "SELECT * FROM (
SELECT id, nachname, vorname, verein, ttr, timestamp FROM anmeldungen_2017_sonntag WHERE gemeldeteKlasse = '2' ORDER BY timestamp ASC LIMIT 64
) as daten
ORDER BY timestamp DESC";


$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}

$anzahl = mysql_num_rows($db_erg);
$jahr = date('Y');

echo "Bisher sind " . $anzahl . " Meldungen zum Turnier " . $jahr . "  bei uns eingegangen! Auflistung nach Meldedatum";
echo "<br>";
echo "<br>";

echo "<table width=\"100%\" border=\"1\" cellpadding=\"3\" cellspacing=\"0\">";
echo "<tr>";
//echo "<td></td>";
echo "<td>Name</td>";
echo "<td>Vorname</td>";
echo "<td>Verein</td>";
echo "<td>QTTR</td>";
echo "<td>Meldedatum</td>";
echo "</tr>";

$anzahl = 1;
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
{
echo "<tr>";
//echo "<td>". $anzahl . "</td>";
echo "<td>". $zeile['nachname'] . "</td>";
echo "<td>". $zeile['vorname'] . "</td>";
echo "<td>". $zeile['verein'] . "</td>";
echo "<td>". $zeile['ttr'] . " </td>";
echo "<td>" . date("d.m.Y G:i:s", strtotime($zeile['timestamp'])) . "</td>";
echo "</tr>";
$anzahl++;
}
echo "</table>";

// Hole die 64 ältesten Datensätze der Klasse 2 ab und sortiere dann absteigend nach TTR (meiste zuerst)
$sql = "SELECT * FROM (
SELECT id, nachname, vorname, verein, ttr, timestamp FROM anmeldungen_2017_sonntag WHERE gemeldeteKlasse = '2' ORDER BY timestamp ASC LIMIT 64
) as daten
ORDER BY daten.ttr DESC";


$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}

$anzahl = mysql_num_rows($db_erg);
$jahr = date('Y');

echo "<br>";
echo "Auflistung o.g. Spieler/innen nach QTTR Punkten";
echo "<br>";
echo "<br>";

echo "<table width=\"100%\" border=\"1\" cellpadding=\"3\" cellspacing=\"0\">";
echo "<tr>";
//echo "<td></td>";
echo "<td>Name</td>";
echo "<td>Vorname</td>";
echo "<td>Verein</td>";
echo "<td>QTTR</td>";
echo "<td>Meldedatum</td>";
echo "</tr>";

$anzahl = 1;
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
{
echo "<tr>";
//echo "<td>". $anzahl . "</td>";
echo "<td>". $zeile['nachname'] . "</td>";
echo "<td>". $zeile['vorname'] . "</td>";
echo "<td>". $zeile['verein'] . "</td>";
echo "<td>". $zeile['ttr'] ."</td>";
echo "<td>" . date("d.m.Y G:i:s", strtotime($zeile['timestamp'])) . "</td>";
echo "</tr>";
$anzahl++;
}
echo "</table>";

mysql_free_result( $db_erg );

echo "</center>\n";

mysql_close($link);
?>

Aber die Zeit vergeht ja wie im Fluge manchmal daher als PDO umsetzen.

Ich habe nun angefangen:
<?php

//Einbinden von CSS Datei
include "css.php.inc";

//Einbinden von Datenbankzugang
require_once "dbVerbindung.php.inc";

//// Hole die 64 Ältesten Datensätze der Klasse 1 ab und sortiere dann absteigend nach Datum (neueste zuerst)
$pdo_1 = new MyPDO();
$sql_1 = "
    SELECT
        id, nachname, vorname, verein, ttr, timestamp
    FROM
        anmeldungen_2017_sonntag
    WHERE
        gemeldeteKlasse = '1'
    ORDER BY
        timestamp ASC LIMIT 64
        ";

// Hole die 64 Ältesten Datensätze der Klasse 1 ab und sortiere dann absteigend nach TTR (meiste zuerst)
$pdo_2 = new MyPDO();
$sql_2 = "
    SELECT
        id, nachname, vorname, verein, ttr, timestamp
    FROM
        anmeldungen_2017_sonntag
    WHERE
        gemeldeteKlasse = '1'
    ORDER BY
        timestamp ASC LIMIT 64
        ";

try {
    printResult($pdo_1->query($sql_1)->fetchAll());
    printResult($pdo_2->query($sql_2)->fetchAll());
} catch (Exception $e) {
    die('Something went wrong...<br />' . $e->getMessage());
}
//Überschrift
$aktuellesJahr = $date->format('Y');
echo " Bisher sind  $anzahlTeilnehmer  Meldungen zum Turnier  $aktuellesJahr   bei uns eingegangen! Auflistung nach Meldedatum.";

function printResult($res_1) {
    echo "<br/><b>Nach Datum</b>
        <table class='table_gesamtspielplan'> 
            <tr>
                <td><b>ID extern</b></td>
                <td><b>ID DB</b></td>
                <td><b>Name</b></td>
                <td><b>Vorname</b></td>
                <td><b>Verein</b></td>
                <td><b>TTR</b></td>
                <td><b>Meldeeingang</b></td>
             </tr>
    ";

    foreach ($res_1 as $val_1) {
        $date = DateTime::createFromFormat('Y-m-d H:i:s', $val_1["timestamp"]);
        $newDate = $date->format('d.m.Y H:i');
//        $anzahlTeilnehmer = $date->format('d.m.Y H:i');
        $aktuellesJahr = $date->format('Y');     
        echo "
        <tr>
            <td> {$val_1["id"]} </td>
            <td> {$val_1["id"]} </td>
            <td> {$val_1["nachname"]} </td>
            <td> {$val_1["vorname"]} </td>
            <td> {$val_1["verein"]} </td>
            <td> {$val_1["ttr"]} </td>
            <td> {$newDate} </td>
        </tr>
        ";
    }
    echo "</table>";
  
 function printResult($res_2) {
    echo "<br/><b>Nach TTR</b>
        <table class='table_gesamtspielplan'> 
            <tr>
                <td><b>ID extern</b></td>
                <td><b>ID DB</b></td>
                <td><b>Name</b></td>
                <td><b>Vorname</b></td>
                <td><b>Verein</b></td>
                <td><b>TTR</b></td>
                <td><b>Meldeeingang</b></td>
             </tr>
    ";

    foreach ($res_2 as $val_2) {
        $date = DateTime::createFromFormat('Y-m-d H:i:s', $val_1["timestamp"]);
        $newDate = $date->format('d.m.Y H:i');
//        $anzahlTeilnehmer = $date->format('d.m.Y H:i');
        $aktuellesJahr = $date->format('Y');     
        echo "
        <tr>
            <td> {$val_2["id"]} </td>
            <td> {$val_2["id"]} </td>
            <td> {$val_2["nachname"]} </td>
            <td> {$val_2["vorname"]} </td>
            <td> {$val_2["verein"]} </td>
            <td> {$val_2["ttr"]} </td>
            <td> {$newDate} </td>
        </tr>
        ";
    }
    echo "</table>"; 
}
 }
?>

Das Ganze ist eine Seite mit 2 Tabellen.
Die erste Zeile beinhaltet:
Bisher sind XX Meldungen zum Turnier XXX bei uns eingegangen!
Dann Tabellenüberschrift Meldung nach Meldeeingang (Datum)
Tabelle 1 mit max. 64 Teilnehmern ab Anmeldedatum. Mehr wie 64 dürfen nicht angezeigt werden.
Direkt darunter dann Tabelle 2: Tabellenüberschrift nach TTR sortiert.
Tabelle 2 mit den o.g. 64 Teilnehmern, sortiert nach TTR
fertig.

Mit meinem o.g. PDO, wird mir nur die erste Tabelle aufgezeigt mit 64 Teilnehmern.
Tabelle 2 wird mir nicht aufgezeigt..
In jeder Tabelle würde ich gerne von 1 - 64 hochzählen. Wie wird dies realsiert?
Die Überschrift mit Bisher sind $anzahlTeilnehmer Meldungen zum Turnier $aktuellesJahr bei uns eingegangen! Auflistung nach Meldedatum."; wird auch nicht aufgezeigt

14.03.2018 07:29 | geändert: 14.03.2018 07:31

5 chorn

Was kommt denn raus, wenn du das fetchAll beider Queries ausgibst? Das soltle ja erstmal identisch zu dem mysql_* Ergebnis sein.

14.03.2018 11:44

6 tobi

aktuell wird nur eine Tabelle aufgezeigt und nicht beide.

14.03.2018 12:59

7 tobi

keine Ahnung warum, aber ich habe nun nochmals neu gemacht und ich bekomme nun 2 Tabellen aufgelistet.
Jetzt wie realisiere, dass die Sortierung der 2. Tabelle nach dem TTR Wert erfolgt (die 64 nach Meldeeingang ersten)?
Und wie bekomme ich eine Aufzählung von 1 - max 64 in der ersten Spalte hin?

<?php

//Einbinden von CSS Datei
include "css.php.inc";

//Einbinden von Datenbankzugang
require_once "dbVerbindung.php.inc";

// Hole die 64 Ältesten Datensätze der Klasse 1 ab und sortiere dann absteigend nach Datum (neueste zuerst)
$pdo_1 = new MyPDO();
$sql_1 = "
    SELECT
        id, nachname, vorname, verein, ttr, timestamp
    FROM
        anmeldungen_2017_sonntag
    WHERE
        gemeldeteKlasse = '1'
    ORDER BY
        timestamp ASC LIMIT 64
";

// Hole die 64 Ältesten Datensätze der Klasse 1 ab und sortiere dann absteigend nach TTR (meiste zuerst)
$pdo_2 = new MyPDO();
$sql_2 = "
    SELECT
        id, nachname, vorname, verein, ttr, timestamp
    FROM
        anmeldungen_2017_sonntag
    WHERE
        gemeldeteKlasse = '1'
    ORDER BY
        timestamp ASC LIMIT 64
 ";

try {
    printResult_1($pdo_1->query($sql_1)->fetchAll());
    printResult_2($pdo_2->query($sql_2)->fetchAll());
} catch (Exception $e) {
    die('Something went wrong...<br />' . $e->getMessage());
}
function printResult_1($res_1) {
    echo "<b>Teilnehmerliste nach Meldeeingang sortiert</b>
        <table class='table_gesamtspielplan'> 
            <tr>
                <td><b>ID DB</b></td>
                <td><b>Name</b></td>
                <td><b>Vorname</b></td>
                <td><b>Verein</b></td>
                <td><b>TTR</b></td>
                <td><b>Meldeeingang</b></td>
             </tr>
    ";

    foreach ($res_1 as $val_1) {
        $date = DateTime::createFromFormat('Y-m-d H:i:s', $val_1["timestamp"]);
        $newDate = $date->format('d.m.Y H:i');
        echo "
        <tr>
            <td> {$val_1["id"]} </td>
            <td> {$val_1["nachname"]} </td>
            <td> {$val_1["vorname"]} </td>
            <td> {$val_1["verein"]} </td>
            <td> {$val_1["ttr"]} </td>
            <td> {$newDate} </td>
        </tr>
        ";
    }
    echo "</table>";

function printResult_2($res_2) {
    echo "<br><b>Teilnehmerliste nach TTR sortiert</b>
        <table class='table_mannschaften'> 
            <tr>
                <td><b>ID DB</b></td>
                <td><b>Name</b></td>
                <td><b>Vorname</b></td>
                <td><b>Verein</b></td>
                <td><b>TTR</b></td>
                <td><b>Meldeeingang</b></td>
            </tr>
    ";

    foreach ($res_2 as $val_2) {
        $date = DateTime::createFromFormat('Y-m-d H:i:s', $val_2["timestamp"]);
        $newDate = $date->format('d.m.Y H:i');
        echo "
        <tr>
            <td> {$val_2["id"]} </td>
            <td> {$val_2["nachname"]} </td>
            <td> {$val_2["vorname"]} </td>
            <td> {$val_2["verein"]} </td>
            <td> {$val_2["ttr"]} </td>
            <td> {$newDate} </td>
        </tr>
        ";
    }
    echo "</table>";
}
}
?>

14.03.2018 13:37

8 Jörg

Jetzt wie realisiere, dass die Sortierung der 2. Tabelle nach dem TTR Wert erfolgt (die 64 nach Meldeeingang ersten)?

In der mysqli_*-Version hast du die 64 ersten Datensätze in einer Subquery geholt und das Ergebnis sortiert. Das könntest du doch in der PDO-Version auch so machen? also für $sql_1 die Query einsetzen, die du zuvor für $sql eingesetzt hast. Oder gab es damit irgendein Problem (Fehlermeldung), dass du die Abfrage geändert hast?

14.03.2018 14:18 | geändert: 14.03.2018 14:20

9 tobi

Wenn ich dies 1zu1 übernehme, kommt eine Fehlermeldung

// Hole die 64 Ältesten Datensätze der Klasse 1 ab und sortiere dann absteigend nach TTR (meiste zuerst)
$pdo_2 = new MyPDO();
$sql_2 = "(
    SELECT
        id, nachname, vorname, verein, ttr, timestamp
    FROM
        anmeldungen_2017_sonntag
    WHERE
        gemeldeteKlasse = '1'
    ORDER BY
        timestamp ASC LIMIT 64
        ) as daten
ORDER BY daten.ttr DESC
 ";

ergibt

Something went wrong...
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' as daten ORDER BY daten.ttr DESC' at line 3

15.03.2018 06:18 | geändert: 15.03.2018 06:34

10 tobi

Hatte das SELECT * FROM vergessen mit zu kopieren.
Jetzt werden beide Tabellen angezeigt.

Jetzt noch zum hochzählen. Ich hätte nun gerne noch, dass eine Spalte hinzu kommt, in der von 1 - 64 hochgezählt wird. Geht dies genauso wie in der ursprünglichen Datei?

15.03.2018 08:00