PHP MySQL Inline Editing mit jQuery Ajax - Problem mit HTML Tags

TOMahawk85

Erfahrenes Mitglied
Hallo,

ich wollte für die Arbeit eine datenbankgestützte Tabelle erstellen, die sobald der Inhalt einer Zelle geändert wird, die Änderung in die Datenbank überträgt. Unter http://phppot.com/php/php-mysql-inline-editing-using-jquery-ajax/ habe ich gefunden, was ich brauchte.

Es funktioniert auch einwandfrei - außer ich will HTML-Tags, oder genauer gesagt "<" und ">", in die Datenbank übertragen. Sobald eines dieser beiden Zeichen in einer Zelle steht, wird alles ab diesen Zeichen in der Datenbank gelöscht.

Ich habe schon versucht das Problem mit "htmlspecialchars()" und "htmlentities()" in der "saveedit.php" zu lösen, hatte damit aber keinen Erfolg.
Da Ajax auch ein Teil dieses Editors ist und ich im Gegensatz zu PHP wenig bis keine Ahnung davon habe, weis ich nicht, ob es nicht vielleicht daran liegt.

Unten habe ich mal den kompletten Code (so viel ist es ja nicht) eingefügt. Es kann ja eigentlich nur an der "saveedit.php" oder der "dbcontroller.php" liegen.


Es würde mich freuen, wenn mir ein Experte verraten kann, wodurch mein Problem verursacht wird. Und das Problem mus gelöst werden, da die Arbeit mit HTML-Tags essentiell wichtig ist.

Mit freundlichen Grüßen,
TOMahawk

index.php
Code:
<?php
require_once("dbcontroller.php");
$db_handle = new DBController();
$sql = "SELECT * from list_content";
$faq = $db_handle->runQuery($sql);
?>
<html>
    <head>
      <title>PHP MySQL Inline Editing using jQuery Ajax</title>
        <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
        <script>
        function showEdit(editableObj) {
            $(editableObj).css("background","#FFF");
        }
        function saveToDatabase(editableObj,column,id) {
            $(editableObj).css("background","#FFF url(loaderIcon.gif) no-repeat right");
            $.ajax({
                url: "saveedit.php",
                type: "POST",
                data:'column='+column+'&editval='+editableObj.innerHTML+'&id='+id,
                success: function(data){
                    $(editableObj).css("background","#FDFDFD");
                }       
           });
        }
        </script>
    </head>
    <body>       
       <table class="tbl-qa">
              <tr>
                <th class="table-header">Answer</th>
              </tr>
          <?php
          foreach($faq as $k=>$v) {
          ?>
              <tr class="table-row">
                <td contenteditable="true" onBlur="saveToDatabase(this,'description','<?php echo $faq[$k]["sku"]; ?>')" onClick="showEdit(this);"><?php echo $faq[$k]["description"]; ?></td>
              </tr>
        <?php
        }
        ?>
        </table>
    </body>
</html>

dbcontroller.php
Code:
<?php
class DBController {
    private $host = "localhost";
    private $user = "bla";
    private $password = "blabla";
    private $database = "blablabla";
    function __construct() {
        $conn = $this->connectDB();
        if(!empty($conn)) {
            $this->selectDB($conn);
        }
    }
    function connectDB() {
        $conn = mysql_connect($this->host,$this->user,$this->password);
        return $conn;
    }
    function selectDB($conn) {
        mysql_select_db($this->database,$conn);
    }
    function runQuery($query) {
        $result = mysql_query($query);
        while($row=mysql_fetch_assoc($result)) {
            $resultset[] = $row;
        }       
        if(!empty($resultset))
            return $resultset;
    }
    function numRows($query) {
        $result  = mysql_query($query);
        $rowcount = mysql_num_rows($result);
        return $rowcount;   
    }
}
?>

saveedit.php
Code:
<?php
require_once("dbcontroller.php");
$db_handle = new DBController();
$result = mysql_query("UPDATE list_content set " . $_POST["column"] . " = '".$_POST["editval"]."' WHERE  sku=".$_POST["id"]);
?>
 
Ich habe es jetzt nicht getestet, aber ich würde tippen das es nicht an den Klammer (< und >) liegt sondern an den Anführungsstrichen der Properties.
Um dieses Problem zu umgehen nutze die Funktion addslashes, dadurch werden die Anführungsstriche maskiert.

Desweiteren hast du in deiner saveedit.php eine Instanz der Datenbank Klasse, aber nutzt dann zum Ausführen des Queries das mysql_query direkt.
Der sauberen Progammstruktur halber würde ich an deiner Stelle der Datenbankklasse eine Funktion verpassen, die auch Update, Delete, Insert Statements durchführen kann.

Kommen wir zur Datenbankklasse bzw. insgesamt deinen Datenbankabfragen.
Du nutzt noch die mysql_* Funktionen.
Diese sind alle Deprecated und seit Jahren nicht mehr gewartet.
Es können deshalb Fehler in den Funktionen enthalten sein.

Wenn du noch am lernen bist gewöhne dir das Arbeiten mit diesen Funktionen gar nicht erst an.
Wenn du schon länger Programmierst, dann gewöhne dir das Arbeiten mit diesen Funktionen am besten wieder ab.

In beiden Fällen nutze lieber die mysqli_* Funktionen, die mysqli-Klasse oder gleich PDO.
Am besten schaust du dir gleich noch Prepared Statements an und gewöhnst dir die auch noch an.
Dadurch brauchst du dich nicht um das Escapen von Nutzer eingaben kümmern, um SQL-Injections abzufangen.
 
Zurück