Mit fwrite SQL Daten in HTML schreiben

kanada

Mitglied
Hallo, ich programiere gerade eine Arbeitsplan Liste für unsere Maschinenführer, die auf einer HTML Seite sehen sollen was als nächstes zu produzieren ist. Da von den Maschinen Rechnern nicht auf den Server zugriffen werden kann, sondern nur eine Freigabe Ordner vorhanden ist. Möchte ich, das wenn der Schichführer in seiner Liste die Prios ändern, diese in eine HTML geschrieben werden und diese in dem Freigabe Ordner abgelegt wird.

Die datei schreiben erstellen, zu füllen ist im grundsatz nicht das Problem. Aber wie verpacke ich die MySQL Abfrage als Schleife das alle Datensätze einzeln in die HTML geschrieben werden.

Code:
<?php
    require('dbconnect.php');
    $position = $_POST['position'];
    $i=1;
    foreach($position as $k=>$v){
        $sql = "Update db_arbeitsplan SET position=".$i." WHERE id=".$v;
        $mysqli->query($sql);
        $i++;
    }
    $HTMLDatei = fopen("Test_Arbeitsplan.html", "w");
    fwrite($HTMLDatei, '<!DOCTYPE html>
        <html lang="de">
            <head>
                <title>Arbeitsplan</title>
                <meta http-equiv="refresh" content="900">
                ...
                <div class="row">
                    <div class="col-md-12">
                        <table class="table table-bordered table-striped">
                            <thead class="">
                                <tr>
                                    <th class="th">Pos</th>
                                    ...
                                </tr>
                            </thead>
                            <tbody class="row_position">');
$sql = "SELECT * FROM db_arbeitsplan ORDER BY Position";
                        $result = $mysqli->query($sql);
                        while($auftrag = $result->fetch_assoc())
                            {  
                                fwrite($HTMLDatei, $auftrag['position'] ); #nur Testausgabe, fehlt Tabellen Struktur
                            }
                            fwrite($HTMLDatei, '</tbody>
                        </table>  
                    </div>
                </div>
            </div>                      
        </body>
        </html>
        ');
    fclose($HTMLDatei);
?>

Die Datensätze in einer Tabelle ausgeben mit der while ist kein Ding aber wie verpacke ich das bei write? Irgendwie stehe ich da heute auf dem Schlauch :-(
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Offtopic: Dein Code ist anfällig für SQL-Injections und ggf. auch XSS (quasi HTML-Injection; beides große Sicherheitslücken).
 

basti1012

Erfahrenes Mitglied
Ich würde die Ausgaben ( die in das file geschrieben werden sollen ) erst sammeln und in einer Variable speichern, und ganz am ende des Codes erst speichern.
das wäre mein Weg
PSYDO CODE
PHP:
<?php
    require('dbconnect.php');
    $position = $mysqli->real_escape_string($_POST['position']);
    $i=1;
    $priofield = $mysqli->real_escape_string($_POST['priofield']);
    foreach($position as $k=>$v){
        $mysqli->query("Update `db_arbeitsplan` SET `position`='$i', `priorisiert` = '$priofield' WHERE `id`='$v'");
        $i++;
    }
$sammeln='<!DOCTYPE html>
<html lang="de">
     <head>
           <title>Arbeitsplan</title>
           <meta http-equiv="refresh" content="900">
    </head>
    <body>
           <div class="row">
                 <div class="col-md-12">
                      <table class="table table-bordered table-striped">
                            <thead class="">
                                <tr><th class="th">Pos</th></tr>
                            </thead>
                            <tbody class="row_position">';
                        $result = $mysqli->query("SELECT * FROM `db_arbeitsplan` ORDER BY `Position`");
                        while($row = $result->fetch_assoc()){
                                $sammeln.="<tr><td>".$row['position']."</td></tr>";
                            }
                          $sammeln.='</tbody>
                        </table>
                    </div>
                </div>            
        </body>
</html>';
file_put_contents('Test_Arbeitsplan.html',$sammeln);
?>
 
Zuletzt bearbeitet:

kanada

Mitglied
@ basti1012
danke für die Gedankenstütze, hab es nach deinem Vorschlag nun umgesetzt und es geht, danke dir.

@ ComFreek
da hast du vollkommen Recht, basti1012 hat es in seinem Beispiel gleich mit aufgegriffen, so hatte ich das auch bei mir drinnen stehen, nur ging dies nicht, da blieb der Wert null. Das selbe in Basti Beispielcode. Daher hatte ich das zum Test erst einmal heraus genommen.

Code:
$position = $mysqli->real_escape_string($_POST['position']);
 

kanada

Mitglied
Okay, hab das ganze beim restlichen Projekt mal daraufhin abgeändert. Danke für den Hinweis.

In dem Beispiel hier oben geht es aber trotzdem nicht. Weder per real_escape_string noch per prepare. Der Wert kommt von einer sortierenbaren Tabelle.

Code:
$(".row_position").sortable({
            delay: 150,
            stop: function() {
                var selectedData = new Array();
                $('.row_position>tr').each(function() {
                    selectedData.push($(this).attr("id"));
                });
                updateOrder(selectedData);
            }
        });
        function updateOrder(data) {
            $.ajax({
                url:'arbeitsplan_sortupdate.php',
                type:'post',
                data:{position:data},
                success:function(data){
                    toastr.success('Änderung gespeichert');
                    document.location.reload();   
                }
            })
        }
 

basti1012

Erfahrenes Mitglied
Was genau geht den jetzt nicht?
Kommt im PHP Script den alles, an was du erwartest?
Einfach mal am Anfang ausgeben lassen mit
Code:
echo "<pre>";
print_r($_POST['position']);
echo "</pre>";
Vielleicht wäre in dein fall auch PHP: mysqli::multi_query - Manual eine alternative, anstatt das durch die Schleife zu jagen.

Was sagt den das Error Reporting ?
Woher kommt das $_POST['priofield'] , ich kann das im JS Code nicht finden und sollte schon ein Fehler ausgeben.
 

kanada

Mitglied
Das priofield ist in der Zwischenzeit heraus geflogen, daher im unteren Codeteil nicht mehr vorhanden, hab es jetzt auch im ersten Beitrag mal heraus genommen. Lasse ich den Code ganz oben ohne escape oder prepare gibt er mir die Position-Nr. weiter ($position = $_POST['position'];). Nutze ich dann prepare oder escape ist dann $position leer ($position = $mysqli->real_escape_string($_POST['position']);)
 

basti1012

Erfahrenes Mitglied
Der Code aus #1 ist jetzt aktuell wie du ihn benutzt ?
So funktioniert es ?
Code:
    require('dbconnect.php');
    $position = $_POST['position'];
    print_r($position);
so aber nicht ?
Code:
    require('dbconnect.php');
    $position = $mysqli->real_escape_string($_POST['position']);
    print_r($position);

Was zeigt den print_r($position); den an ?
 

kanada

Mitglied
Sorry für die späte Antwort, du hast das richtig verstanden, beim injection anfälligen Code gibt print_r die passende Position Nummer aus, die übermittelt wurde. Beim zweiten Beispiel bleibt print_r leer, zeigt nichts an bzw. gibt nichts aus. Mir ist das ganze auch ein Rätsel.

An anderen stellen arbeite ich im gleichen Projekt ja anstandlos mit real_escape_string und es funktioniert, nur bei dieser Funktion nicht.