forum



  • Ah hab schon:

    $sql = "SELECT * FROM XXXX ORDER BY ID DESC LIMIT 1";
    	$result = mysql_query($sql);
    	while($row = mysql_fetch_object($result))
    	{
    	$id = "$row->ID";
    	}
    


  • bah... vorsicht... mach ne Transaction draus.

    Wenn noch jemand einen Eintrag macht, bevor du die ID geholt hast, hast du sonst ein Problem..

    außerdem: dafür gibts die PHP-Funktion mysql_insert_id() .

    also in etwa so:

    <?php
    
    mysql_query("START TRANSACTION");
    
    mysql_query("INSERT INTO topic (Thema) VALUES ($titel)");
    
    $id = mysql_insert_id();
    
    mysql_query("INSERT INTO post (Antwort, Von, Thema) VALUES ($antwort, $von, $id)");
    
    mysql_query("COMMIT");
    ?>
    

    und außerdem: wenn du den höchsten Wert haben willst, gibts die Aggregat-Funktion MAX() in SQL. Das geht deutlich schneller als die ganze Tabelle zu sortieren. "SELECT *" sollte sowieso unbedingt vermieden werden



  • Danke Zwuutz!
    Aber was genau bedeutet:
    mysql_query("START TRANSACTION");
    ...und
    mysql_query("COMMIT");



  • Ok habs gegoogelt. Sorry für den unnötigen Post.



  • "SELECT *" sollte sowieso unbedingt vermieden werden

    Auch wenn man alle Einträge ausgeben will? Was ist denn die Alternative?



  • schlandiner schrieb:

    "SELECT *" sollte sowieso unbedingt vermieden werden

    Auch wenn man alle Einträge ausgeben will? Was ist denn die Alternative?

    explizit die Spalten angeben, die man haben will, notfalls eben alle.

    bei "SELECT *" ist die Reihenfolge der Spalten nicht immer die, die man erwartet, was zumindest den numerischen Zugriff unmöglich macht. Selbst wenn es funktioniert kann es beim Wechsel auf eine andere Datenbank oder dem Rückspielen einer Sicherung plötzlich Probleme geben.
    Außerdem funktioniert der Query immer. Ändert sich eine Spaltenbezeichnung kann man also nicht aufgrund der Rückgabe des SQL-Servers die Richtigkeit überprüfen.
    Frägt man dann die nicht mehr existierende Spalte ab kann es zu sonderbaren Verhalten je nach Umgebung führen



  • Ok danke werde ich berücksichtigen.
    Also select spalte1, spalte2, spalte3 From .... ?

    Nochmal eine Frage. Mein Script ist so aufgebaut:

    // Lade und zeige mir alle Antworten

    //Ganz unten folgt das Antwortformular

    <form method="post" action="aktuelleseite.php">
    .....
    </form>

    if (isset($_POST['submit']))
    {
    //neue Antwort eintragen
    }

    //HIER möchte ich jetzt, dass er diese Seite neu lädt, damit der neue Eintrag auch mit angezeigt wird also irgendwi ein Befehl: Seite neu laden.

    Hab auch schon gegoogelt aber die header() Funktion kann ich hier leider ja nciht verwenden.



  • bau dein Skript so auf:

    <?php
    
    if (isset($_POST['submit'])
    {
       // Antwort eintragen
       // neuladen per header-redirect
    }
    
    ?>
    <html>
    <head>
    <blablabla ...
    
    <!-- antworten anzeigen -->
    
    <form method="post" action="<?php echo $PHP_SELF;?>">
    ...
    </form>
    <...>
    

    also mach das am Anfang der Seite bereits. Solang du noch keine Ausgabe machst, klappt auch der header-Umbau.

    Alternativ lagere das Eintragen in ein zusätzliches Skript aus, dass du mit der Form aufrufst und leite von dort aus wieder auf die normale Seite weiter. So macht es auch z.B. dieses Forum hier



  • kunoiwo schrieb:

    Danke Zwuutz!
    Aber was genau bedeutet:
    mysql_query("START TRANSACTION");
    ...und
    mysql_query("COMMIT");

    Interessanter für mich: Welchen vorteil habe ich denn genau davon. Im gegensatz ohne Transaction?



  • Sqwan schrieb:

    Interessanter für mich: Welchen vorteil habe ich denn genau davon. Im gegensatz ohne Transaction?

    Transakionen werden vom Datenbanksystem als Atomar angesehen. Typisches Problem: B liest einen Wert, A liest denselben Wert, B schreibt diesen Wert, A schreibt diesen Wert. Das was B geschrieben hat ist somit verloren gegangen. Wenn A und B Transaktionen sind, werden diese nacheinander ausgeführt. B liest, B schreibt, A liest, A schreibt.


Anmelden zum Antworten