# Mit fwrite SQL Daten in HTML schreiben



## kanada (29. April 2021)

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.


```
<?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 :-(


----------



## ComFreek (29. April 2021)

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


----------



## basti1012 (29. April 2021)

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
    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);
?>
```


----------



## kanada (3. Mai 2021)

@ 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.


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


----------



## ComFreek (3. Mai 2021)

Nutze lieber Prepared Statements anstatt real_escape_string.


----------



## kanada (5. Mai 2021)

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.


```
$(".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 (5. Mai 2021)

Was genau geht den jetzt nicht?
Kommt im PHP Script den alles, an was du erwartest?
Einfach mal am Anfang ausgeben lassen mit

```
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 (5. Mai 2021)

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 (5. Mai 2021)

Der Code aus #1 ist jetzt aktuell wie du ihn benutzt ?
So funktioniert es ?

```
require('dbconnect.php');
    $position = $_POST['position'];
    print_r($position);
```
so aber nicht ?

```
require('dbconnect.php');
    $position = $mysqli->real_escape_string($_POST['position']);
    print_r($position);
```
 
Was zeigt den print_r($position); den an ?


----------



## kanada (25. Mai 2021)

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.


----------



## basti1012 (25. Mai 2021)

kanada hat gesagt.:


> 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.


Wenn das Online wäre könnte man vielleicht noch paar Sachen testen, doch so kann ich jetzt auch nichts finden.

Ich habe aber noch eine Theorie.
Hier erstellst du doch ein Array was du zum PHP Script schickst

```
$(".row_position").sortable({
            delay: 150,
            stop: function() {
                var selectedData = new Array();
                $('.row_position>tr').each(function() {
                    selectedData.push($(this).attr("id"));
                });
                updateOrder(selectedData);
            }
        });
```

Im PHP Script ballerst du ein Array in real_escape_string

```
$position = $mysqli->real_escape_string($_POST['position']);
```
Ich bin kein PHP Profi aber , mysqli_real_escape_*string * , wird meiner Meinung nach SO nicht mit arrays funktionieren.

Vieleicht klappt das ?

```
function test($val){
    return mysqli_real_escape_string($val);
}

$position = array_walk($_POST['position'], 'test');
```
Psydo Code,Goggle bitte selber noch mal wegen richtigkeit


----------

