PHP - ja.
http://www.php-kurs.com/
Das ist das "PHP-Stück"
dieses Forums.
Beiträge von cottton
-
-
Gerade kein Projekt im Kopf x.x
Du hattest mir mal die Navi ohne Javascript per checkbox gezeigt. Find den Thread aber auch nicht mehr. -
-
Was mache ich falsch?
Alles. Sorry, ist aber so.
Eine Passwortabfrage - also die Prüfung auf das richtige Passwort - gehört nicht in den Browser - wie hier im Fall Javascript.
Javascript ist für jeden einsehbar.
Mit while/do-while -Schleifen sollte man sowas auch nicht machen.JavaScript
Alles anzeigenvar versuche = 0; var rest, code, eingabe; // wie gesagt - pw-abfrage nicht in JS und keine while ect // aber um die fehler aufzuecken - hier kommentiert: do { versuche++; // das ++ sollte (meine meinung) immer am ende stehen rest = 4 - versuche; // dann müsstest du hier auch nicht "runtricksen". eingabe = prompt("Bitte PIN eingeben\nSie haben noch " + rest + " Versuche"); if(eingabe == 3365) // wie gesagt - das pw hier könnte jeder nachlesen alert("Sie haben Zugang"); // wenn du mal noch ne zeile hinzufügst o.ä., dann schöägt hier was fehl. "keine klammern nutzen" ist nicht cool =) else if(eingabe == null) break; else alert("Zugang verweigert"); } while(versuche < 3 && eingabe != 3365); if(versuche = 3 && eingabe != 3365)// das hier ist wohl dein hauptfehler: versuche = 3 #hier passiert eine zuweisung. //es sollte sicherlich versuche == 3 oder versuche === 3 sein //oder besser versuche >= 3 alert("Sie haben die maximale Anzahl an Versuchen erreicht"); else if(versuche <= 3 && eingabe == null) alert("Programmabbruch"); else alert("Viel Spaß"); // wenn hier jetzt html/text steht/kommt, den nicht jeder sehen sollte, // dann sieht ihn jeder, der JS abgeschalten hat. -
Hab da noch paar Sachen für Dich:
- transactions
- optimize table
- query log
Transaktionen:
Das Prinzip ist einfach. Du willst 2 Aktionen durchführen: löschen, und updaten.
Wenn das eine nicht geht, soll das andere nicht sein.
Dafür gibts Rollback.Wenn Du ohne PHP arbeitest (also die Queries direkt auf dem Server ausführst), dann siehe hier: http://dev.mysql.com/doc/refman/5.7/en/commit.html
ROLLBACK siehe: http://stackoverflow.com/a/9327843Falls Du mysqli_ nutzt, dann siehe hier: http://php.net/manual/de/mysqli.begin-transaction.php
Und im Falle PDO: http://php.net/manual/de/pdo.begintransaction.phpOptimize table kann ich gerade nur von innodb sprechen
Wenn Du viele (hunderte/tausende) Datensätze gelöscht hast, dannkannwird es sein, dass die Tabelle größer wird, oder gleich groß bleibt.
Warum? Es wurde ja gelöscht.
Ja, aber innodo Tabelle sammeln Daten zur Wiederherstellung, falls was schief geht (und das ist gut).
Wendest Du nun "OPTIMIZE TABLE mytablename;" an, dann reorganisiert der Server die Tabelle. Die nicht mehr benötigten Daten werden entfernt.
(hatte das Problem mal mit einer Tabelle die ~10 GB groß war, und nach dem Löschen um die 30 GB :D)Query log
Du sagtest, dass Du aus einer Tabelle löschst, und in der anderen Tabelle wird gleich mit gelöscht.
Um genau zu sehen, was da alles passiert, kannst Du die Query log einschalten.
Dadurch siehst Du jede Query, die ausgeführt wird.
Aber Vorsicht beim laufenden Betrieb -- wenn Du nen Server hast, der 20 Queries per sec bekommt, dann bekommst Du 20 Queries (oder mehr) geschrieben.
Am besten auf einem Testsystem nutzen, auf dem nur Deine Aktionen ausgeführt werdenSQL
Alles anzeigen-- vorbereiten SET global general_log = 1; -- einschalten SET global log_output = 'table'; -- output auf einen table setzen (ohne, wird in file geschrieben) truncate mysql.general_log; -- die table gleich mal leeren -- jetzt deine delete query ausführen ... select * from mysql.general_log; -- alle mitgeschriebenen queries anzeigen -- vor dem nächsten test wieder leeren truncate mysql.general_log; ----------- -- wenn fertig, query log wieder abschalten ! SET global general_log = 0; truncate mysql.general_log;
So kannst Du schön sehen, was noch alles passiert, wenn Du einen User löschst. Evtl siehst Du dann, was Du noch in die neue Tabelle schreiben/kopieren musst -- als Backup. -
Ist nicht unnötig =)
Manchmal sieht man die Bäume ... und das mit dem Wald ..
-
PS: Die Account-Daten habe ich ungehasht gemacht. d.h
das geht dann aber nicht.
Was Du da machst sieht dann in etwa so aus:Codepassword_verify( $password, $userRow['password']) ) gleich vergleicheHashes( $password, $hierEigentlichHashErwartetAberTextPwÜbergeben )Siehe hier: Loginpasswort richtig hashen - password_hash() & password_verify()
-
Muss ein großen Pluspunkt für PHPStorm erwähnen: STRG + B (Sucht die Definition oder Verwendung von ...)
Ein Traum, wenn man Code zurückverfolgen muss.
Ein kluger Malkasten
-
Dann gibt es bei den Tabellen sicherlich schon die Verknüpfung per Fremdschlüssel.
Das ist gut.Was Du jetzt egitl nur machen musst:
Weiß grad nicht, ob ich auf die Schnelle was vergessen hab. Aber im Prinzip war es das schon.Würde allerdings - wenn benötigt - noch etwas "verbessern":
SQL
Alles anzeigen-- die tmp tbl updaten - davon ausgegangen, du hast ein feld date_delete angelegt -- und davon ausgegangen, dass alle im tmp tbl ok sind - also gelöscht werden sollten/können UPDATE hwf35_users_for_delete SET date_delete = NOW() WHERE date_delete = '0000-00-00 00:00:00'; -- die sind also nun alle als zu löschen/gelöscht makiert ... -- dann löschen wir die auch aus der orig table: DELETE FROM hwf35_users WHERE ID IN ( SELECT id FROM hwf35_users_for_delete WHERE date_delete != '0000-00-00 00:00:00' );
Evtl noch anpassen. -
Ja, was wolf sagt -- Trigger (von mir nicht empfohlen), oder Fremdschlüssel (foreign key).
Das müsste man bei der Erstellung der neuen Tabelle beachten.Weiß ja nicht, was die neue Tabelle für einen Zweck erfüllt.
Ich tippe mal: Du willst sicherheitshalber erst alle Datensätze in einer extra Table haben, um sie zu kontrollieren.
Dann, wenn alles ok ist, sollen diese gefilterten/gefundenen Datensätze in der originalen Tabelle gelöscht werden.Wenn dem so ist, und Du GANZ sicher gehen musst, dann
- erstelle neue (nicht temporäre) Tabelle tbl_name_29112015 (mit alles Column/Feldern die wichtig sind (oder allen Feldern =)))
- lege dabei eine zusätzliche Column an: deleted_at oder delete_date not null, datetime format, default '0000-00-00 00:00:00'
- kontrolliere die gefilterten Datensätze der neuen Tabelle
- wenn gelöscht werden kann, dann setze delete_date auf NOW() und lösche in den originalen TabellenVorteil:
Du hast Backups den Datensätze, welche als gelöscht markiert sind.
Im Notfall könntest Du diese wiederherstellen.
EDIT: Du könntest auch die kompletten Tabellen kopieren. Das kann aber bissl blöd sein, wenn dort sehr viel Datensätze vorhanden sind.DELETE:
Du hattest 2 Tabellen. Evtl musst Du dann auch auf beiden löschen:
siehe "Multiple-Table Syntax" http://dev.mysql.com/doc/refman/5.7/en/delete.htmlFremdschlüssel (ON DELETE CASCADE) könnten hier auch helfen. Aber dazu müsste man erstmal wissen
- wozu die neue Tabelle eigtl dient
- ob die vorhandenen Tabellen in der Struktur geändert werden dürfen -
Spricht nix dagegen. Ich meine ja nur -- wenn Du eine $_POST-Variable ausliest, dann kam die über POST.
Ich will Dich davon nicht abbringen. Im just sayin
Du kannst Natürlich ganz am Anfang klarstellen:
-
Die Reihenfolge ist hier das Problem, glaub ich.
Du selektierst
regDate, userName, id, ...
Also schiebt er sicherlich das regDate in die erste Column -- id.Dann setze einfach die Values
wie in etwaSQL
Alles anzeigenINSERT INTO hwf35_users_for_delete -- die neue tabelle (registerDate, username, id, posts, lastvisitDate, email) -- die rehenfolge "bekannt machen" SELECT j.registerDate, j.username, j.id, k.posts, j.lastvisitDate, j.email FROM hwf35_users j INNER JOIN hwf35_kunena_users k ON (j.id=k.userid) WHERE j.registerDate <= DATE_SUB(CURDATE(), INTERVAL 180 DAY) AND j.lastvisitDate <= DATE_SUB(CURDATE(), INTERVAL 179 DAY) AND k.posts<1 ORDER BY j.id -
Wenn es eine wirklich temporärer Tabelle ist, dann empfehle ich Memory-Table (ram / daten beachten).
https://dev.mysql.com/doc/refman/5.5…age-engine.htmlWenn nicht genug RAM ... dann temp table
http://dev.mysql.com/doc/refman/5.7/en/create-table.html
(beachte, dass diese tbl nach der Session weg sind. Im Zweifel nen normalen Table)Und da die Tabelle ähnlich aufgebaut sein müsste, mach CREATE TABLE LIKE Sinn.
https://dev.mysql.com/doc/refman/5.7…table-like.htmlbsp:
SQL
Alles anzeigen-- create mem table like CREATE TABLE hwf35_users_temp_mem -- bissl lang, nenne sie wie du willst =) LIKE hwf35_users -- aus deiner query sehe ich, dass du die daten von dieser tabelle brauchst. -- und anstatt k.userid kannst du ja auch j.id select-en (oder auch nicht, denn die sind ja gleich - siehe ON (j.id=k.userid) ) ENGINE = MEMORY; -- oder create temp table like CREATE TEMPORARY TABLE hwf35_users_temp LIKE hwf35_users; -- oder create table like CREATE TABLE hwf35_users_temp LIKE hwf35_users;
Und dann kannst Du die selektierten Daten in die neue Tabelle schieben:
http://dev.mysql.com/doc/refman/5.7/en/insert-select.htmlSQL
Alles anzeigen-- insert into select INSERT INTO hwf35_users_temp -- die neue tabelle (tbl, temp tbl, oder mem tbl) SELECT j.registerDate, k.userid, j.username, j.id, k.posts, j.lastvisitDate, j.email FROM hwf35_users j INNER JOIN hwf35_kunena_users k ON (j.id=k.userid) WHERE j.registerDate <= DATE_SUB(CURDATE(), INTERVAL 180 DAY) AND j.lastvisitDate <= DATE_SUB(CURDATE(), INTERVAL 179 DAY) AND k.posts<1 ORDER BY j.lastvisitDate
Evtl musst Du die Tabelle doch selbst definieren, wenn zB ein Feld X einen Wert benötigt, aber Du diesen nicht im SELECT selektierst. -
jetzt seh ich gerade, da ist ja einiges "krum".
Erstmal:PHPstrtoupper( $_SERVER['REQUEST_METHOD'] == 'POST' ) // geht gar nicht das gehört so: strtoupper($_SERVER['REQUEST_METHOD']) == 'POST'Und warum sollte die request method in der Form-Action stehen?
PHP<form action="<?php $_SERVER['REQUEST_METHOD']?>" method="POST"> // in die action gehört das ziel -- zB /index.php oder "" (leer) für das gleiche script, ...PHP
Alles anzeigen<?php // strtolower macht im if nicht so richtig sinn. $sendPrice = null; if(isset($_POST['send_price'])){ $sendPrice = strtolower($_POST['send_price']); // evtl trimmen $sendPrice = trim($sendPrice); } if($sendPrice) { if(strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') { // sehe den sinn nicht. // du prüfst, ob POST send_price gesetzt ist -- also wird das sicherlich ne post request sein // es sei denn, aus irgendeinem grund wird irgendwo $_POST['var'] = $_GET['var'] gemacht $package_small = array( 'small_one'=>10.00, 'small_two'=>25.00, 'small_three'=>50.00 ); ?> <table border="1"> <tr><td> Packet </td> <td>Preis in €</td></tr> <!-- <td> Packet </td> unnötige leerzeichen --> <?php foreach($package_small as $key=>$value) { ?> <tr> <td> <?php $key ?> </td><!-- echo $val--> <td> <?php $value ?> </td><!-- echo $val--> </tr> <?php } } } ?> <form action="<?php $_SERVER['REQUEST_METHOD']?>" method="POST"><!-- action="" --> <input type="submit" name="send_price"> -
-
-
Kommt draus an, wie Dein bisheriger Code aussieht.
PHP
Alles anzeigen<?php // davon ausgegangen, dass registerDate im format Y-m-d H:i:s vorliegt // 90 zuvor per php berechnen: $daysBack = 90; $daysBefore = date('Y-m-d H:i:s', strtotime('-' . abs((int)$daysBack) . ' day', time())); $sql = "select ... where registerDate < :days_before"; // < oder <= //(jetzt per mysqli_ oder PDO die Query ->prepare(), Parameter übergeben/binden, execute) // 90 zuvor per sql berechnen: $daysBack = 90; $sql = "select ... where registerDate < DATE_SUB(NOW(), INTERVAL :days_back DAY)"; // < oder <= //(jetzt per mysqli_ oder PDO die Query ->prepare(), Parameter übergeben/binden, execute) -
-
"Contents" order "contents" ?
Groß-klein-Schreibung

-
Würde das strenggenommen nicht auch reichen?
Würde ich vermeiden.
Denn so lässt Du ja das Script volle Kanne in ein Fatal Error rennen
Du solltest mindestens prüfen, ob die Klasse existiert.
Wenn sie existiert, dann hast du sie ja sicherlich geschrieben und sie wird die benötigte Methode besitzen.
Den "Schritt" zur Klasse könnte User aber selbst ansteuern, indem er rumprobiert.
Und anstatt ihm dann den Fatal Error (oder eine weiße Seite) zu zeigen, würde ich einfach umleiten auf die Hauptseite (oder 404).