41
Kannst du den Codeabschnitt hier mal posten?
Mein SQL-Skript:
DELIMITER $$
DROP PROCEDURE IF EXISTS p$$
CREATE PROCEDURE p()
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE x,y VARCHAR(255);
DECLARE j,k INTEGER;
DECLARE cur CURSOR FOR SELECT wort_de FROM Woerterbuch.English;
DECLARE sor CURSOR FOR SELECT wort_en FROM Woerterbuch.English;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
OPEN sor;
OPEN cur;
REPEAT
FETCH cur INTO x;
FETCH sor INTO y;
SET j = (SELECT id FROM Woerterbuch.Worte WHERE Wort = x AND Sprache = 'de');
SET k = (SELECT id FROM Woerterbuch.Worte WHERE Wort = y AND Sprache = 'en');
INSERT IGNORE INTO Woerterbuch.Kombis (Kombi,Eine_id,Andere_id) VALUES ('trans',j,k);
UNTIL done
END REPEAT;
CLOSE cur;
CLOSE sor;
END$$
DELIMITER ;
CALL p();
Was nichts mit dem xampp-System zu tun hat, funktioniert währenddessen nach wie vor. Anders als übergroße XML-Dateien, die mir den gesamten Computer lahmlegen.
ALTER TABLE woerterbuch ADD UNIQUE KEY wort_index (wort, sprache);
Ich wußte garnicht, daß das geht. Sieht nach einer guten Lösung aus.
Die Ausgabe von top :
top - 20:49:15 up 54 min, 3 users, load average: 0.13, 0.08, 0.06
Tasks: 151 total, 2 running, 149 sleeping, 0 stopped, 0 zombie
Cpu(s): 57.0%us, 4.5%sy, 0.0%ni, 38.2%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3355404k total, 1362764k used, 1992640k free, 163672k buffers
Swap: 2103292k total, 0k used, 2103292k free, 583060k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3310 mysql 20 0 178m 41m 5580 S 115 1.3 10:37.95 mysqld
1254 root 20 0 69084 28m 5848 S 4 0.9 1:14.81 Xorg
2649 chef 20 0 132m 28m 19m S 2 0.9 0:06.22 konsole
2085 chef 20 0 152m 39m 26m S 1 1.2 0:27.18 kwin
2863 root 20 0 0 0 0 S 0 0.0 0:00.73 kworker/1:0
3581 chef 20 0 2512 1032 736 R 0 0.0 0:00.83 top
1 root 20 0 5208 3312 1828 S 0 0.1 0:00.87 systemd
2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0 0.0 0:00.10 ksoftirqd/0
6 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/0
7 root RT 0 0 0 0 S 0 0.0 0:00.01 watchdog/0
8 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/1
10 root 20 0 0 0 0 S 0 0.0 0:00.42 ksoftirqd/1
12 root RT 0 0 0 0 S 0 0.0 0:00.01 watchdog/1
13 root 0 -20 0 0 0 S 0 0.0 0:00.00 cpuset
14 root 0 -20 0 0 0 S 0 0.0 0:00.00 khelper
15 root 20 0 0 0 0 S 0 0.0 0:00.00 kdevtmpfs
16 root 0 -20 0 0 0 S 0 0.0 0:00.00 netns
17 root 20 0 0 0 0 S 0 0.0 0:00.00 sync_supers
18 root 20 0 0 0 0 S 0 0.0 0:00.00 bdi-default
19 root 0 -20 0 0 0 S 0 0.0 0:00.00 kintegrityd
20 root 0 -20 0 0 0 S 0 0.0 0:00.00 kblockd
21 root 0 -20 0 0 0 S 0 0.0 0:00.00 md
23 root 20 0 0 0 0 S 0 0.0 0:00.00 khungtaskd
24 root 20 0 0 0 0 S 0 0.0 0:00.00 kswapd0
25 root 25 5 0 0 0 S 0 0.0 0:00.00 ksmd
26 root 39 19 0 0 0 S 0 0.0 0:00.36 khugepaged
27 root 20 0 0 0 0 S 0 0.0 0:00.00 fsnotify_mark
28 root 0 -20 0 0 0 S 0 0.0 0:00.00 crypto
32 root 0 -20 0 0 0 S 0 0.0 0:00.00 kthrotld
Ich kann nicht behaupten, daß ich jetzt viel schlauer wäre als vorher. iotop ist nicht vorhanden. Ich denke, daß es am sinnvollsten ist, mit dem SQL-Skript zu einem Hoster umzuziehen. Dafür muß ich nur schauen wie ich die Sicherungsdatei hochgeladen bekomme, schließlich ist die inzwischen ungefähr 200 Megabyte groß.
Außerdem muß ich wahrscheinlich wegen der Sicherheit noch etwas unternehmen. Bei mir zuhause ist die Datenbank nicht abgesichert.
htmlentities() (oder besser htmlspecialchars()) würde ich immer erst bei der Ausgabe in HTML anwenden, weil dort alle Strings behandelt werden müssen, nicht nur die aus der Datenbank. Zum anderen kann es durchaus passieren, dass man Daten aus der Datenbank auch in Bereichen verwenden möchte, wo ein htmlentities() bzw. htmlspecialchars() wieder rückgängig gemacht werden müsste.
Kein htmlentities() bedeutet aber, sich jedem Angriff hilflos auszuliefern? Da braucht die Benutzereingabe, die entweder ein neuer Datensatz oder nur ein Suchbegriff sein kann, nur mit "> beginnen...
Oder war es "; ? Fast egal, jedenfalls muß es entschärft werden. Also kann ich nicht einfach so irgendetwas eintragen lassen. Dann muß auch noch, hätte ich fast vergessen, eine Behandlung mit mysql_real_escape_string() her, falls das überhaupt noch die aktuelle Fassung der Funktion ist. Ist htmlspecialchars() nicht nur eine veraltete Version von htmlentities() ?
Dann erinnere ich mich auch noch schwach an irgendetwas Sicherheitsrelevantes mit 1=1 in einer Query....
Eine JOIN Abfrage baut nicht auf Subqueries auf. Entscheidend sind die ON Statements, mittels derer zwei Tabellen über einen (Fremd-)Schlüssel verknüpft werden.
Also habe ich ON vergessen und die Query sollte so aussehen:
SELECT Sprache, Wort, Art, Info FROM Kombis INNER JOIN Zusatz ON ID = id WHERE id = ((SELECT anderes_Wort FROM Kombis WHERE Kombi = 'trans' AND ein_Wort = (SELECT id FROM Worte WHERE Wort = ? AND Sprache = ?)) OR (SELECT anderes_Wort FROM Kombis WHERE Kombi = 'trans' AND ein_Wort = (SELECT id FROM Worte WHERE Wort = ? AND Sprache = ?)))
Es sei denn, daß es id = ID statt ID = id heißen müßte. Die Tabelle Zusatz enthält nicht für jedes Wort einen Datensatz. Aber die Tabelle Kombis sollte immer mindestens ein Ergebnis liefern, weil die Suche nach einer Übersetzung der Hauptzweck der Query ist.
Ranma