Die leeren Felder werden über array_filter() entfernt, da brauche ich keine weitere Abfrage
Beiträge von Arne Drews
-
-
-
Unter Berücksichtigung des Affenformular-Prinzips, würde ich den PHP-Teil in etwa auf diesem Schema aufbauen:
PHP
Alles anzeigen<?php // preset result output $sTableResult = ''; // validate post data are sent $bHasData = isset( $_POST['frmData']['search'] ) && !empty( array_filter($_POST['frmData']['search'], 'trim') ) if ( $bHasData ) { // sanitize post/search data $aData = filter_var_array( array_filter($_POST['frmData']['search'], 'trim'), FILTER_SANITIZE_STRING ); $sAuthorSearch = '%' . ( $aData['author'] ?? '' ) . '%'; $sTitleSearch = '%' . ( $aData['title'] ?? '' ) . '%'; // include pdo connection include_once 'dbconnect.php'; // predefine query $sQuery = 'select author, title, release, pages, costs from books where '; // building clauses array $aClauses = array_map( function( $key ) { return $key . ' like :' . $key; } , array_keys( $aData ) ); // building prepared statement $oStmnt = $oPDO->prepare( $sQuery . implode(' and ', $aClauses) ); // executing with parameters $oStmnt->execute( $aData ); // array to store table rows $aTableRows = []; // building table rows ( assuming we use PDO::FETCH_OBJ ) while ( $row = $oStmnt->fetch() ) $aTableRows[] = '<tr><td>' . $row->title . '</td><td>' . $row->author . '</td></tr>'; // defining table $sTableResult = '<table><thead><tr><td>Title</td></tr><tr><td>Author</td></tr></thead><tbody>' . implode($aTableRows) . '</tbody></table>'; }
Der HTML-Teil dazu sähe in etwa so aus:
PHP
Alles anzeigen<html> <head> <title>foobar</title> </head> <body> <form name="frmSearchBooks" method="post"> <fieldset> <div> <label for="author">Author</label> <input id="author" type="text" name="frmData[search][author]"> </div> <div> <label for="title">Title</label> <input id="title" type="text" name="frmData[search][title]"> </div> </fieldset> <fieldset> <button type="submit">SEARCH</button> </fieldset> </form> <?php echo $sTableResult; ?> </body> </html>
-
Das Affenformular-Prinzip ist auch aus meiner Sicht hier das sinnigste.
-
Mal nebenbei, Deine Logik macht keinen Sinn. Das for-Attribut in Deinen <label>-Tags zeigen ins Nirvana.
Was Dein Problem betrifft: Reagiere auf das Klick-Event der Radiobox "unfrei" und entferne entsprechend die Selektion im <select>.
-
Kopieren im dem Zusammenhang das ich eine Kopie der Datei mache und einfach zb statt den Datensatz der id 1 den datensatz der id 2 anzeigen lassen will
Ok, das sollte unproblematisch sein...
Endet halt jedes mal in einen Error deswegen frage ich nach einer Möglichkeit
Dann zeig doch mal wenigstens mal, wie Du es versucht hast.
-
Es gibt auch die Möglichkeit das über die locales zu machen, darüber bieten manche Datumsfunktionen die Möglichkeit, solche Angaben in der Regionalsprache auszugeben.
Aber um bei dem Array zu bleiben, ist das noch ein Tick einfacher umsetzbar:
-
Was heißt denn "Kopieren" in dem Sinne, die Quelldatei oder den Browser-Quelltext?
Im Browser-Quelltext steht nur das Resultat, nicht die Abfrage selber.
Scheint mir, dass Du noch gar keinen Versuch selbst starten konntest?
-
Schau doch mal in die Konsole, vielleicht siehst Du den Fehler dann...
-
Auf Injektion sollte man immer achten, sobald man mit benutzerdefinierten Daten arbeitet, was in diesem Fall das Formular ist.
Auch die WHERE-Klausel kann dahingehend manipuliert werden, dass ein DELETE im Anschluss ausgeführt wird.
Auch PreparedStatements sollten immer verwendet werden.
htmlspecialchars() is allerdings nicht für/gegen solche Injektions gedacht.
-
Ist auch Blödsinn. So etwas sollte allein schon aufgrund der Usability auf PHP-Seite passieren.
Wenn Suchfelder leer sind, werden diese einfach nicht in die WHERE-Klausel übernommen, das muss man nicht mit irgendwelchen Checkboxen den Benutzer entscheiden lassen.
Beispiel
Man hat 3 Suchspalten, also bedient man sich dreier Input-Felder:
Code<input type="text" name="frmSearchFields[firstname]" placeholder="Vorname"> <input type="text" name="frmSearchFields[lastname]" placeholder="Nachname"> <input type="text" name="frmSearchFields[city]" placeholder="Stadt">
PHP könnte dann beispielhaft so aussehen:
PHP
Alles anzeigen<?php $aPostData = array_filter( $_POST['frmSearchFields'], 'trim' ); $aPostData = filter_var_array( $aPostData, [ 'vorname' => FILTER_SANITIZE_STRING, 'nachname' => FILTER_SANITIZE_STRING, 'city' => FILTER_SANITIZE_STRING ]); $aWhereConditions = array_map( function($value, $key) { return $key . " like '%" . $value . "%'"; } , $aPostData , array_keys( $aPostData ) ); $sSQLSelect = 'SELECT spalte1, spalte2, spalte3 FROM myTable WHERE ' . implode( ' and ', $aWhereConditions );
nicht getestet, aber so in etwa würde ich das prinzipiell aufbauen.
vorname, nachname und city sollten in dem Fall natürlich bereits die Spaltennamen sein.
-
Jedoch kann ich die die Variable content in meinem Code nicht verwenden.
Wenn das das einzige Problem ist, dann lass die Variable doch einfach weg und schreibe es direkt ins DOM:
-
Ich glaube auch eher, dass mit Erstellen create gefordert ist, anstatt über innerHTML.
Man hätte jetzt nicht gleich wieder eine komplette Lösung zeigen müssen, aber der Ansatz sieht gut aus.
-
TabbedContent ist auch mit reinem HTML5 und CSS3 machbar.
-
Dann stimmt etwas mit Deinem HTML-Aufbau nicht, so dass die entsprechenden Elemente nicht gefunden werden.
Dass das Prinzip mit dem grundsätzlichen Aufbau funktioniert, ist ja nun verdeutlicht.
Check mal die Konsole, da steht häufig drin, was nicht stimmt, gerade bei JavaScript-Gedöns
-
Denn nimm mal einen anderen Browser. M$ hat glaube ich im Edge auch gern eigene Filter drin.
Auf der Arbeit kann es natürlich auch sein, dass die Administration da was sperrt.
Wäre aber ein schönes Beispiel, warum man sich auch heutzutage nicht auf JavaScript verlassen sollte!
Meine nicht Dich speziell damit, aber weil es oft Diskussionen gibt, dass manche meinen JavaScript würde überall laufen...
-
Schnucki... Hast Du einen Script-Blocker laufen?!
-
Dann machst Du irgendwas anderes falsch. Nur mal ohne den DIV-Content, aonst aber 1:1 übernommen:
https://codepen.io/anon/pen/dKaLdB?editors=1010
funktioniert einwandfrei...
-
Ich sehe da kein id="tab1"!
Und Dein echo/printf-Salat macht keinen Sinn.
Das f bei printf() steht für format/formatted, was Du absolut gar nicht nutzt. Ein simples echo reicht stattdessen vollkommen.
Mal als kleines Beispiel, wie das nach EVA aussehen könnte:
PHP
Alles anzeigen<?php $milestone_content = ( $milestone=="all" ) ? $line['automotive_standard_document_'.$peptype.'_'.$lang] : $line[$peptype.'_standard_document_'.$milestone.'_'.$lang]; echo <<<EOHTML <div id="standard" class="w3-container"> <table border="0" width="900"> <tr> <td colspan ="2"></td> </tr> <tr> <th colspan="3" style="text-align:center" bgcolor="#f4f6f7">{$lang_modal_auto_standard_doc_title}</th> </tr> <tr> <td colspan="3" style="vertical-align:middle"><p title= "{$lang_modal_auto_standard_doc_title_2}">{$milestone_content}</p></td> </tr> <tr> </tr> </table> </div> EOHTML;
Jetzt darfst Du entscheiden, was für Dich übersichtlicher ist, von der Verarbeitung jedenfalls ist diese Variante sinnvoller.
-
Genau das war gemeint: Das Script steht immer noch vor den Content-DIVs, kann diese also nicht matchen und somit nicht ausblenden.
Mir scheint der Kontextwechsel auch stark contra EVA zu sein. Warum gibst Du das Script als HTML aus und die <div>s per printf() über PHP?
Trenne HTML von PHP.