Ankündigung

Einklappen
Keine Ankündigung bisher.

Einfaches Newssystem mit Mysql

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Einfaches Newssystem mit Mysql

    Hallo,

    Hier ist mal ein kleines newssystem^^

    Tabelle `news`
    Code:
        CREATE  TABLE `news` ( `id` INT( 11  )  NOT  NULL  AUTO_INCREMENT ,
     `autor` VARCHAR( 50  )  NOT  NULL ,
     `title` VARCHAR( 50  )  NOT  NULL ,
     `beitrag` TEXT NOT  NULL ,
     PRIMARY  KEY (  `id`  ) ,
     INDEX (  `id`  ) 
    ) ENGINE  =  MYISAM
    Diesen code einfach bei PHPMYADMIN als SQL befehl ausführen.

    Das Formular (add_news.php)
    Code:
    <form method="post" action="add_news.php">
    <table>
        <tr>
            <td>Autor</td>
            <td><input type="text" name="autor"></td>
        </tr>
        <tr>
            <td>Titel</td>
            <td><input type="text" name="title"></td>
        </tr>
        <tr>
            <td>Beitrag</td>
            <td><textarea name="beitrag"></textarea></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" name="news" value="News Posten"></td>
        </tr>
    </table>
    </form>
    Das ist das formular zum hinzufügen von neuen news...

    Fehlt aber noch die Funktion^^

    PHP script mit in die add_news.php einfügen
    PHP-Code:
    <?php
    $autor 
    mysql_real_escape_string($_POST['autor']);
    $title mysql_real_escape_string($_POST['title']);
    $beitrag mysql_real_escape_string($_POST['beitrag']);

    if(isset(
    $_POST['news']))
    {
    $insert "INSERT INTO news SET autor = '$autor', title = '$title', beitrag = '$beitrag'";
    mysql_query($insert);
    }
    ?>
    Dies alles dient zum einfügen der news in die Tabelle "news"

    nun zum anzeigen der News

    Dazu muss man erst einmal die tabelle ausählen: (news.php)
    PHP-Code:
    $row mysql_fetch_array(mysql_query("select * from news")); 
    und die Tabelle zum anzeigen (news.php):
    PHP-Code:
    <table>
        <tr>
            <td><?php echo htmlentities($row['title']) ?></td>
            <td> geschrieben von <?php echo htmlentities($row['autor']) ?></td>
        </tr>
        <tr>
            <td colspan="2"><?php echo htmlentities($row['beitrag']) ?></td>
        </tr>
    </table>
    es kann sein das es nicht Funktioniert, ich habe es nämlich nicht getestet



  • #2
    mysql_real_escape_string() fehlt bei der Eingabe.
    Wenn man zum Beispiel das war's dann wohl in den Beitrag schreibt, stimmt das genau: Es gibt eine Fehlermeldung von MySQL.
    htmlentities() oder ähnliches fehlt bei der Ausgabe. Bisher können Sachen wie <script type="text/javascript>document.href = 'http://www.welcometomyrealm.bizbizbiz'</script> eingetragen und ausgeführt werden.

    Kommentar


    • #3
      sry, aber ich bin noch ned soweit in php ^^

      edit: isses so besser

      Kommentar


      • #4
        Zitat von Black-Devil Beitrag anzeigen
        sry, aber ich bin noch ned soweit in php ^^

        edit: isses so besser
        Hallo!

        Dann solltest du aber bitte auch kein Tutorial schreiben. Bitte nicht böse auffassen aber ist so. Denn wo zeigst du hier einem User wie er ein Datenbankanbindung schreiben muss und wie die Tabellen festgelegt werden das er überhaupt nachvollziehen kann wo die herkommen etc.

        Auserdem ist dein Code so was von unsicher. Seid mir alle jetut bitte nicht böse oder so aber ich hoffe es nimmt sich niemand ein Beispiel an diesem Script!

        mfg der Litter!
        Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
        http://www.lit-web.de

        Kommentar


        • #5
          Habe das ganze mal in einem Anfall von Langeweile optimiert.

          Tabelle:
          Code:
          CREATE TABLE `news` (
            `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
            `time` INT UNSIGNED NOT NULL,
            `author` VARCHAR(50) NOT NULL,
            `title` VARCHAR(50) NOT NULL,
            `news` TEXT NOT NULL,
            PRIMARY KEY (`id`)
          ) ENGINE = MYISAM;
          Datei input.php:
          PHP-Code:
          <?php
          if (isset($_POST['submit'])) {
              
          mysql_connect("host""user""pass");
              
          mysql_select_db("test_db");
              
              
          $author trim(escape($_POST['author']));
              
          $title  trim(escape($_POST['title']));
              
          $news   trim(escape($_POST['news']));
              
              
          $sql "INSERT INTO `news` (`time`, `author`, `title`, `news`)\n".
                     
          "VALUES (UNIX_TIMESTAMP(), '".$author."', '".$title."', '".$news."');";
              
          mysql_query($sql) or exit("Konnte Eintrag nicht vornehmen!");
          }


          function 
          escape($str) {
              if (!
          get_magic_quotes_gpc()) {
                  
          $str addslashes($str);
              }
              
              return 
          $str;
          }
          ?>

          <form method="post" action="">
          <div id="news_add">
              <label for="author">Autor</label>
              <input type="text" name="author" id="author" size="40" /><br />
              
              <label for="title">Titel</label>
              <input type="text" name="title" id="title" size="40" /><br />
              
              <label for="news">Beitrag</label>
              <textarea name="news" id="news" cols="40" rows="10"></textarea><br />
              
              <input type="submit" name="submit" value="News speichern" />
          </div>
          </form>
          Datei output.php:
          PHP-Code:
          <?php
          mysql_connect
          ("host""user""pass");
          mysql_select_db("test_db");

          $sql "SELECT * FROM `news` ORDER BY `time` DESC;";
          $result mysql_query($sql);

          while (
          $row mysql_fetch_assoc($result)) { ?>
              <div class="news">
                  <h1><?php echo htmlentities($row['title']); ?></h1>
                  <span>Geschrieben von <?php echo htmlentities($row['autor']); ?> am <?php echo date("d.m.Y, H:i"$row['time']); ?>.</span>
                  <div><?php echo nl2br(htmlentities($row['beitrag'])); ?></div>
              </div>
          <?php ?>
          Dazu noch ein paar CSS:
          Code:
          #news_add label {
              display:block;
              width:100px;
              float:left;
          }
          #news_add input[type="submit"] {
              margin-left:100px;
          }
          
          .news {
              font-size:12px;
              border-bottom:1px solid #505050;
              padding:5px;
          }
          .news h1 {
              margin:10px 0 4px 0;
              font-size:14px;
          }
          .news span {
              font-size:11px;
              color:#707070;
              font-style:italic;
          }
          Wer hat noch Lust, zu spielen?
          Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

          Kommentar


          • #6
            function escape($str) {
            if (!get_magic_quotes_gpc()) {
            $str = addslashes($str);
            }

            return $str;
            }
            Auch Parameter, die nicht aus $_GET, $_POST usw. stammen, müssen auf die Benutzung in SQL vorbereitet werden.
            Und addslashes() reicht unter Umständen nicht aus (und magic_quotes ignoriere ich hier einfach, weil sie ein großes Problem für sich allein sind).
            mysql_real_escape_string() dagegen ist eine sichere Sache, wenn es um Daten für MySQL geht. Damit es optimal funktioniert, muss die Verbindungsresource mit angegeben werden.
            PHP-Code:
            <?php
            if (!empty($_POST['author']) && !empty($_POST['title']) && !empty($_POST['news']))
            {
                
            $mysql mysql_connect("host""user""pass");
                if (
            $mysql===false || mysql_select_db("test_db"$mysql)===false)
                {
                    die(
            mysql_error());
                }
                    
                
            $author mysql_real_escape_string($_POST['author'], $mysql);
                
            $title mysql_real_escape_string($_POST['title'], $mysql);
                
            $news mysql_real_escape_string($_POST['news'], $mysql);

                
            $sql "
                    INSERT INTO
                        `news` (`time`, `author`, `title`, `news`)
                    VALUES
                        (UNIX_TIMESTAMP(), '
            $author', '$title', '$news')
                "
            ;
                
            mysql_query($sql$mysql) or exit("Konnte Eintrag nicht vornehmen!");
                echo 
            '<div>neuer Eintrag, id=' mysql_insert_id().'</div>';
            }
            else
            {
                echo 
            '
                    <form method="post" action="">
                        <div id="news_add">
                            <label for="author">Autor</label>
                            <input type="text" name="author" id="author" size="40" /><br />
                        
                            <label for="title">Titel</label>
                            <input type="text" name="title" id="title" size="40" /><br />
                        
                            <label for="news">Beitrag</label>
                            <textarea name="news" id="news" cols="40" rows="10"></textarea><br />
                        
                            <input type="submit" name="submit" value="News speichern" />
                        </div>
                    </form>
                '
            ;
            }
            ?>
            Als nächsten Schritt würde ich (wieder) eine bessere Überprüfung von author, title und news einbauen.
            Und dann den Aufbau der Datenbankverbindung (samt Passwort usw) aus diesem Skript herausnehmen.

            Kommentar


            • #7
              naja okay, für den ersten versuch eines tutorials wars doch eig. gut^^

              Kommentar


              • #8
                Zitat von Black-Devil Beitrag anzeigen
                naja okay, für den ersten versuch eines tutorials wars doch eig. gut^^
                Hallo!

                Du bist dabei genau wie ich das zu lernen und da ist das Tutorial ebend nicht gut. Was ist der sinn eines Tutorials? Es sollen User die die Sprache etc. lernen sich ein Beispiel nehmen können und ein Tut als eventuellen Leitfaden sehen können und das ist bei dir nicht gegeben weil es an allen Ecken und Enden hapert. Wie du siehst wurde es umgecodet so das sich User ein Beispiel nehmen können. Das jeder anders vor und ran geht ist da nicht von Bedeutung denn viele Wege führen bekanntlich nach Rom,aber es muss sicher sein und richtig!

                mfg der Litter
                Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                http://www.lit-web.de

                Kommentar


                • #9
                  @David: addslashes() reicht im Grunde sogar, nur escapet mysql_real_escape_string() noch das Zeichen \1xa.
                  Dass man die Verbindung angeben muss, stimmt nicht. Wenn keine Angegeben wird, wird einfach die zuletzt geöffnete verwendet. Wird keine gefunden, so gibt es eine Warnung.
                  Will man diesen Zwang nicht haben, könnte man theoretisch addcslashes() benutzen. Aber gut, an solchen Funktionen soll man nicht herumspielen.

                  MagicQuotes zu ignorieren ist schlecht, sehr schlecht. Es sei denn, es ist beabsichtigt, statt \' dann schließlich \\\' zu haben.
                  Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                  Kommentar


                  • #10
                    Es gibt Beispiele zu bestimmten Zeichensätzen, bei denen addslashes() nicht ausreicht.
                    Da sich der Zeichensatz bei mehreren Verbindungen unterscheiden kann und weil eben bei nicht vorhandener oder nicht mehr gültigen (kann schnell mal passieren, "server gone") Verbindung nicht sofort eine Warnung ausgegeben wird sondern erst versucht wird eine Default-Verbindung zu MySQL herzustellen, ist die Angabe des Verbindungsobjekt mehr als nur ratsam.
                    Zitat von Manko10 Beitrag anzeigen
                    MagicQuotes zu ignorieren ist schlecht, sehr schlecht. Es sei denn, es ist beabsichtigt, statt \' dann schließlich \\\' zu haben.
                    Magic_quotes ist ein Problem, das ich gesondert behandle, nicht erst bei der Datenbankanbindung.
                    Meiner Meinung nach ist die adäquate Maßnahme dafür
                    PHP-Code:
                    if(get_magic_quotes_gpc())
                    {
                      exit(
                    'Das Skript wird wegen einer Fehlkonfiguration des Servers (magic_quotes_gpc=On) abgebrochen.');

                    Kommentar


                    • #11
                      Ich denke wir sollten das ganze unter Code-Schnipsel packen... verschoben

                      Kommentar


                      • #12
                        Zitat von David Beitrag anzeigen
                        Es gibt Beispiele zu bestimmten Zeichensätzen, bei denen addslashes() nicht ausreicht.
                        Natürlich, addslashes maskiert nicht alles, was mysql_real_escape_string() maskiert.

                        Zitat von David Beitrag anzeigen
                        Da sich der Zeichensatz bei mehreren Verbindungen unterscheiden kann und weil eben bei nicht vorhandener oder nicht mehr gültigen (kann schnell mal passieren, "server gone") Verbindung nicht sofort eine Warnung ausgegeben wird sondern erst versucht wird eine Default-Verbindung zu MySQL herzustellen, ist die Angabe des Verbindungsobjekt mehr als nur ratsam.
                        Man muss die Verbindung nicht angeben.
                        Wird keine angegeben, wird die zuletzt geöffnete benutzt. Erst wenn in diesem Schritt keine gefunden wird, wird versucht, eine Default-Verbindung aufzubauen. Was die Warnung angeht, hast du natürlich Recht, aber das kann man auch mit einem @ umgehen.
                        Zitat von David Beitrag anzeigen
                        Magic_quotes ist ein Problem, das ich gesondert behandle, nicht erst bei der Datenbankanbindung.
                        Meiner Meinung nach ist die adäquate Maßnahme dafür
                        PHP-Code:
                        if(get_magic_quotes_gpc())
                        {
                          exit(
                        'Das Skript wird wegen einer Fehlkonfiguration des Servers (magic_quotes_gpc=On) abgebrochen.');

                        Oha, da wird dein Skript aber nicht auf vielen Servern laufen.
                        Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                        Kommentar


                        • #13
                          Zitat von Manko10 Beitrag anzeigen
                          Oha, da wird dein Skript aber nicht auf vielen Servern laufen.
                          Kann ich mit leben. magic_quotes sind reiner Schrott.

                          Zitat von Manko10 Beitrag anzeigen
                          Man muss die Verbindung nicht angeben.
                          Nein, aber man kann. Und ich habe versucht zu erklären, warum man sollte. Wenn Du nicht willst, dann gib es halt nicht mit an. (Würdest Du bei mir arbeiten, wäre es eine Dinestanweisung. )

                          Kommentar


                          • #14
                            Würde ich bei dir arbeiten, würde ich mich daran halten, dass ich es angeben muss. Immerhin soll jeder Projektleiter selbst entscheiden, welche Coding-Standards seine Mitarbeiter befolgen sollen und daran halte ich mich dann auch.

                            Das MagicQuotes Schrott sind, ist klar. Glücklicherweise werden sie in PHP 6 entfernt.
                            Würdest du eine Anwendung schreiben, die später verteilt werden soll (also eine Websoftware, die jeder auf seinem Server/Webspace benutzen können soll) wäre der Script-Abbruch nicht schlau.
                            Vielleicht könnte man einen Mittelweg einschlagen. Statt das Skript abzubrechen oder die Slashs bei jedem Escapen zu entfernen sollte man eher gleich zu Anfang bei eingeschalteten MagicQuotes sämtliche Input-Arrays "korrigieren".
                            Letztendlich lautet die Regel: "mache deine Software so portabel wie möglich und programmiere in keinem Falle konfigurationsabhängig".
                            Analog wäre auch eine Funktion, die RegisterGlobals rückgängig macht, sinnvoll.
                            Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                            Kommentar


                            • #15
                              Zitat von Manko10 Beitrag anzeigen
                              Letztendlich lautet die Regel: "mache deine Software so portabel wie möglich und programmiere in keinem Falle konfigurationsabhängig".
                              Das sehe ich mittlerweile nur noch bedingt so. Wenn ich buchstäblich mit Leib und Seele daran hängen würde, dass meine Applikation überall läuft - weil ich sonst verhungere oder ausgepeitscht werde - dann vielleicht. Bin ich aber nicht.
                              Ok, ich lasse mich (gnädigst ) herunterhandeln auf etwas wie
                              PHP-Code:
                              if(get_magic_quotes_gpc())
                              {
                                if (
                              true)
                                {
                                  echo 
                              '<div>Das Skript wird wegen einer Fehlkonfiguration des Servers (magic_quotes_gpc=On) abgebrochen.<br />
                                    <Eine Beschreibung, warum magic_quotes schlecht sind, php6, links irgendwo hin>
                                    Wenn es unvermeidlich ist, bla bla '
                                    
                              . (__FILE__) . ' Zeile ' __LINE__'<br />
                                    Kein Support'
                              ;
                                    exit;
                                }
                                else
                                {
                                  
                              // Du wurdest gewarnt
                                  
                              $_POST array_map('stripslashes'$_POST);
                                  
                              /*
                                  $_GET ... 
                                  */
                                
                              }

                              Und das hat nicht nur etwas damit zu tun, dass ich ein Smug bin (das sicherlich auch, ganz bestimmt sogar). Es hat ein wenig mit dem zu tun, was Joel Spolsky in Martian Headsets - Joel on Software ab
                              And this is where Jon Postel caused a problem
                              schreibt.
                              Gegen Misverständnisse: Ich bin kein Fanatiker. Und wenn es jemand hinbekommt, sein Skript überall mit Leichtigkeit zum Laufen zu bringen, ist das eine tolle Sache.

                              edit: Und ich habe gerade Code von mir gefunden (danke Volltextsuche in Archiven), wo ich natürlich auch klag- und wortlos "wenn get_magic_quotes_gpc() dann stripslashes()" ausführe

                              Kommentar

                              Lädt...
                              X