2016-06-20 3 views
0

Ich weiß, diese Frage wurde zuvor gestellt, und ich habe mehrere Vorschläge und Antworten gelesen, aber ich kann es nicht zur Arbeit bekommen.php textarea automatisch speichern auf sql mit jquery/ajax

Ich habe eine TextArea auf einer PHP-Seite, und ich möchte den Inhalt der TextArea in einer SQL-Datenbank gespeichert, während der Benutzer eingibt oder alle 2-5 Sekunden ohne die Seite neu geladen werden.

Ich glaube, dass es mit jquery und Ajax gemacht werden muss?

Der Inhalt wird in der Datenbank gespeichert, wenn ich es als ein POST-Formular mit einer Schaltfläche zum Speichern machen - so weiß ich, dass die SQL funktioniert.

Ich habe diese Dateien: todo.php

<script type='text/javascript' src='//code.jquery.com/jquery-1.9.1.js'></script> 
<form method='post' action='notes.php'> 
<table border='0' cellspacing='0' width='480px' height='250px' align='center' id='logo-table'> 
<tr> 
<td align='center' height='10px' valign='top'><textarea type='text' id='notes_input' name='notes_input' style='width: 460px; height: 230px; border:0px;'>$data[notes]</textarea></td> 
</tr> 
</table> 
<input type='image' src='/nycrm/grafik/Save-as.png' name='gem' value='Submit' /> 
</form> 

und script.php

<?php 
require_once 'connect.php'; 
session_start(); 
$ses_userid = $_SESSION['ses_userid']; 
$notes_input = $_POST["notes_input"]; 

mysqli_query($connect_intra, "UPDATE user SET notes = '$notes_input' where userid = '$ses_userid'"); 
?> 

ich diesen Code versucht, die ich hier auf Stackoverflow gefunden, aber es scheint, als ob der Code nicht ist ausgeführt wird - in diesem Fall sieht die todo.php wie folgt aus:

<?php 

$ses_userid = $_SESSION['ses_userid']; 
$query = mysqli_query($connect_intra, "SELECT notes FROM user WHERE userid = '$ses_userid'"); 
$data = mysqli_fetch_array($query); 

echo" 
<script type=\"text/javascript\" src=\"//code.jquery.com/jquery-1.9.1.js\"></script> 
<script type=\"text/javascript\"> 
$(\"#notes_input\").bind(\"keydown\", function() { myAjaxFunction(this.value); }); 

function myAjaxFunction(value) { 
$.ajax({ 
    url: \"script.php\", 
    type: \"POST\", 
    data: \"notes_input=\" + value, 
    success: function(data) { 
     if (!data) { 
      alert(\"unable to save file!\"); 
     } 
    } 
}); 
} 
</script> 
<form method='post' action='notes.php'> 
<table border='0' cellspacing='0' width='480px' height='250px' align='center' id='logo-table'> 
<tr> 
<td align='center' height='10px' valign='top'><textarea type='text' id='notes_input' name='notes_input' style='width: 460px; height: 230px; border:0px;'>$data[notes]</textarea></td> 
</tr> 
</table> 
<input type='image' src='/nycrm/grafik/Save-as.png' name='gem' value='Submit'/> 
</form> 
"; 
?> 

Ich bin m Ist etwas so, dass es funktioniert?

Ihre Hilfe wird sehr geschätzt.

/Thomas.

+2

** WARNUNG **: Wenn Sie 'mysqli' verwenden, sollten Sie [parametrisierte Abfragen] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) und [' bind_param' verwenden ] (http://php.net/manual/en/mysqli-stmt.bind-param.php), um Benutzerdaten zu Ihrer Anfrage hinzuzufügen. ** Verwenden Sie NICHT ** String-Interpolation oder Verkettung, um dies zu erreichen, weil Sie einen schwerwiegenden [SQL injection bug] erstellt haben (http://bobby-tables.com/). ** NIEMALS ** $ _POST 'oder' $ _GET' Daten direkt in eine Abfrage einfügen, es kann sehr schädlich sein, wenn jemand versucht, Ihren Fehler auszunutzen. – tadman

+0

Hallo Tadman Danke für deine Antwort. Sorry für meine Ignoranz, aber ist das besser? '$ sql = "UPDATE Benutzer SET notes =' $ notes_input 'wo userid =' $ ses_userid 'LIMIT 1"; $ result = mysqli_query ($ connect_intra, $ sql); ' – user3416868

+0

Sie müssen wirklich vermeiden, Dinge wie $ notes_input in Ihrer Abfrage an erster Stelle zu setzen. Versuchen Sie: 'UPDATE Benutzer SET Notizen =? WHERE Benutzer-ID =? LIMIT 1' und dann 'bind_param', um diese beiden Werte zu setzen. Normalerweise aktualisieren Sie eine Notiz basierend auf der ID der Notiz, nicht den Benutzer. Das "LIMIT 1" -Ding scheint hier ein Fehler zu sein. – tadman

Antwort

0

Browser liest HTML von oben nach unten. Wenn es ein Skript-Tag findet, pausiert es das Skript und bewertet es.

In Ihrem Beispiel, wenn das zweite Skript gestartet wird, existiert noch kein Textarea. Daher jquery kann keinen Knoten mit der ID notes_input finden, erstellen Sie einfach leere jquery-Objekt, um Fehler in weiteren Funktionen zu verhindern.

Sie sollten das zweite Skript (mit .bind Anweisung) bis Ende body Tag oder Umbruch biding zu jquery.ready Funktion verschieben. Die Ausführung des Skripts wird verzögert, bis die Seite vollständig analysiert wurde.

+0

Fantastisch .. Es funktioniert! Vielen Dank. Nachdem ich diese Frage gepostet habe, habe ich TinyMCE zu den Textareas hinzugefügt. Ich habe herausgefunden, dass wenn TinyMCE aktiviert ist, es nicht beim Tippen speichert, aber wenn ich TinyMCE deaktiviere, funktioniert es? – user3416868

+0

TinyMCE ersetzt wahrscheinlich Ihre Bindung durch eigene.Wenn Sie Ereignisse mit TinyMCE erhalten möchten, müssen Sie ihre Ereignisse anhören. [Überprüfen Sie diese Frage] (http://stackoverflow.com/questions/5765981/tinymce-on-keypress-a-am-try-to-display-the-preview-of-the-content) – Arnial