php loop script ausführen mittels js


rernanded

Erfahrenes Mitglied
Hallo,
suche Idee wie ich einen Loop mittels js aufrufen kann - falls denn js dafür die beste Lösungsmöglichkeit ist.

Aufgabe: js soll mittels id das php script alle 10 sekunden aufrufen und zwar jeweils mit um 1 sich erhöhender id

1. Aufruf bei 1. Sekunde(bzw. bei vollständig geladener Seite) id = 1
2. Aufruf bei 11. Sekunde id = 2
3. Aufruf bei 21. Sekunde id = 3
usw.

MONI

PHP:
<?php
$servername = "localhost:3306";
$username = "";
$password = "";
$dbname = "";

$connection = new mysqli($servername, $username, $password, $dbname);

if ($connection->connect_error) {
     die("Connection failed: " . $connection->connect_error);
}

$id = $_POST['id'];

$sql = "SELECT * FROM tablename WHERE id='$id'";

$result = $connection->query($sql);

if ($result->num_rows > 0) {
    
    while($row = $result->fetch_assoc()) {
    echo "id:<br />".$row["id"]."<br />";
    echo "eins:<br />".$row["eins"]."<br />";
    echo "zwei:<br />".$row["zwei"]."<br />";
    echo "drei:<br />".$row["drei"]."<br />";
    echo "<hr>";

     }
} else {
     echo "Kein Ergebnis.";
}

$connection->close();
?>
 

basti1012

Erfahrenes Mitglied
Das kannst du mit Ajax machen.
Mit sertinterval rufst du mit Ajax dein Php Script auf und gibst ihn dann eine id mit die sich erhöht.
Javascript:
<script>
var time=10000;
var ende=20;
function php_aufrufen(id,ende){
       if(id<=ende){
           $.ajax({
               type: 'POST',
               url: 'php_script.php',
               data: {id:id},
               success: function(data){
                  setTimeout(function(){
                       id++;
                     console.log(data);
                     php_aufrufen(id,ende);
                    },time);
               },
               error:function(err){
                      console.log('Fehler beim aufrufen = '+err)            
               }
           });
       }
}
php_aufrufen(0,ende);
</script>
so ungefähr, ist jetzt ungetestet.
console.log(data) zeigt dir dann das an was im Php Script als echo ausgegeben wird
 

ComFreek

Mod | @comfreek
Moderator
@ComFreek Yeap, ich würde ein mysqli_real_escape_string einsetzen. an welcher Stelle würdest Du vorschlagen?
Bitte lieber mit Prepared Statements arbeiten :)

echo "eins:<br />".$row["eins"]."<br />"; echo "zwei:<br />".$row["zwei"]."<br />"; echo "drei:<br />".$row["drei"]."<br />";
Je nachdem, was die Spalten enthalten können, hast du hier auch XSS als Sicherheitslücke. Am besten einfach immer htmlspecialchars draufwerfen, siehe PHP Doku dazu.
 

rernanded

Erfahrenes Mitglied
@basti1012

Sorry, Dein Vorschlag will nicht.
ich hab es mal so probiert (s.u.), klappt aber auch nicht, bin etwas ratlos.

HTML:
<script>
var time=10000;
var max=30;
function myFunction() {
if(id<=max){
$.ajax({
               type: 'POST',
               async: false,
               url: 'meine.php',
               data: {id},
               success: function(data){
                  setInterval(function(){
                       id++;
                     console.log(data);
                    myFunction();
                    },time);
        }
      }
    }
}
</script>
<button onclick="myFunction()">los</button><br /><br /><br />
 
Zuletzt bearbeitet:

basti1012

Erfahrenes Mitglied
Kuck dir mein Script an und deins, dann siehst du das du einiges geändert hast was so jetzt nicht mehr klappt
Kopiere das 1 zu1
HTML:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<button id="button">los</button>
<script>
var time=10000;
var ende=20;
function php_aufrufen(id,ende){
       if(id<=ende){
           $.ajax({
               type: 'POST',
               url: 'back.php',
               data: {id:id},
               success: function(data){
                  setTimeout(function(){
                       id++;
                     console.log(data);
                     php_aufrufen(id,ende);
                    },time);
               },
               error:function(err){
                      console.log('Fehler beim aufrufen = '+err)         
               }
           });
       }
}

document.getElementById('button').addEventListener('click',function(){
      php_aufrufen(0,ende);
})
</script>
Zum testen habe ich das Php Script genommen damit man auch sieht das es funktioniert
back.php
PHP:
<?php
if(isset($_POST['id'])){
     echo 'Id zurück zum test'. htmlspecialchars($_POST['id']);
}else{
     echo "So nicht";
}
?>
Dein problem wahr
1. data: {id}, // muss so sein {id:id} oder halt das was man mit geben will
2. setInterval // das wäre in den Fall eine tötliche Schleife für den Browser ( Absturz nach paar Minuten )
3. myFunction(); // da muss die id und max mit myFunction(id,max) , glaube nicht das es ohne geht in den fall
4. bei den klammern fehlt ein ) nach den }

Nimm an besten mein Script und wenn es geht ändere immer ein Teil und wenn das geht das nächste und so weiter.
Wenn du alles auf einmal änderst findest du den Fehler nicht mehr .
 

rernanded

Erfahrenes Mitglied
@basti1020
hier nochmals mein geändertes Ursprungsscript mit der Bitte mal damit zu testen, ich krieg es nämlich nicht hin. Testweise habe ich 30 Einträge/Datensätze in der Datenbank.


HTML:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<?php
$host = "localhost";
$port = "3306";
$username = "";
$password = "";
$dbname = "";

$pdo = new PDO("mysql:host=$host;port=$port;dbname=$dbname", "$username", "$password");

$id = $_POST['id'];

$statement = $pdo->prepare(" SELECT * FROM wow WHERE id = $id ");

$statement->execute();

$result = $statement->fetchAll();

         foreach ($result as $row) {
            echo $row["id"]."<br />".$row["wow"];
        }

?>
</body>
</html>
 

basti1012

Erfahrenes Mitglied
Funktioniert den mein Script ? Mit den Php Schnipsel den ich gepostet habe zum testen ?
Dein Php Code kann ich so jetzt nicht testen.
Verstehe nur nicht was das soll
Code:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
Dein Php Code
</body>
</html>
Der ist unnötig in den jetztigen Code.

Mal nee Frage.
Muß das ein setInterval sein und so weiter ?
Ich baue mir gerade eine Datenbank zusammen wo jede Stadt mit jeder Strasse mit Geo Daten eingelesen werden( Fertige Systeme kosten Geld ).

Damit beim abspeichern das Php Script nicht ein Timeout veursacht habe ich das so gemacht wie du.
Bei mir sind die id`s nur Postleitzahlen.
Wenn eine Postleitzahl eingelesen wurde erhöhe ich Zahl im Php Script ,
Dann gebe ich es als echo raus.
Das Ajax Script erkennt das und ruft das Php Script wieder auf mit der erhöhten Postleitzahl.

Was hast du den genau vor ?
Poste nochmal das ganze Script ( html,js,php ) wie du es gerader hast.
Mit deinen letzten Beitrag komme ich nicht weiter
 

rernanded

Erfahrenes Mitglied
@basti1020 Dein letztes Script funktioniert, doch auf meine Anwendungsidee passt es irgendwie nicht. Danke Dir trotzdem vielmals.

Nochmals die Idee: Normalerweise rufe ich per Eingabe einer id in einem Formular das php-Script auf und erhalte den zur id passenden Datenbankeintrag angezeigt. Dies kann ich händisch von 1 bis ultimo machen, so lange bis eben keine ids und keine Datenbankeinträge mehr vorhanden sind. Das mache ich alles "intern", so dass ursprünglich sicherheitsrelevante Einstellungen wie comFreek sie monierte nicht nötig sind.

Nun will ich das Ganze aber automatisieren. Das js-script soll meine händischen Formulareinträge ersetzen und dies alle 10 Sekunden. Dabei also die id immer um "+1" erhöhen.
Wenn ich dann einen Fehler in den Einträgen entdecke würde ich das js-script stoppen. Ich denke 10 Sekunden reichen mir zur Sicht-Kontrolle aus. Ansonsten ändere ich im js-Scripts die Zeitspanne.

Moni

PS: Hier mal alle Scriptteile mit denen ich getestet habe. Nimm doch bitte mal die Teile/zeilen raus die nicht gebraucht werden.

PHP:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=8859-1">
</head>
<body>

<form action="test.php" method="post">
ID: <input type="text" name="id">
<br />
<input type="submit" value="ok">
</form>

<?php
$host = "localhost";
$port = "3306";
$username = "";
$password = "";
$dbname = "";


$pdo = new PDO("mysql:host=$host;port=$port;dbname=$dbname", "$username", "$password");

$id = $_POST["id"];

$statement = $pdo->prepare(" SELECT * FROM wow WHERE id = $id ");

$statement->execute();

$result = $statement->fetchAll();

         foreach ($result as $row) {
            echo $row["id"]."<br />".$row["url"];
        }

?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<button id="button">los</button>
<script>
var time=10000;
var ende=30;
function php_aufrufen(id,ende){
       if(id<=ende){
           $.ajax({
               type: 'POST',
               async: false,
               url: 'test.php',
               data: {id:id},
               success: function(data){
                  setTimeout(function(){
                       id++;
                     console.log(data);
                     php_aufrufen(id,ende);
                    },time);
               },
               error:function(err){
                      console.log('Fehler beim aufrufen = '+err)      
               }
           });
       }
}

document.getElementById('button').addEventListener('click',function(){
      php_aufrufen(0,ende);
})
</script>
</body>
</html>
 
Zuletzt bearbeitet:

basti1012

Erfahrenes Mitglied
Machst du das alles in einer Datei ?
Also das Html mit den Js , zusammen mit den Php Teil ?
Sowas nennt man Affenformular, obwohl ich das in diesen Fall ehr nicht so nutzen würde.
Ich hatte zwischenzeitig was gebastelt ,damit du ein Beispiel hast.
Bei Time kannst du zb die 10 Sekunden nehmen oder aus , was dann so schnell wie möglich ist.

Im Php Script kannst du es ja auch Automatisch auslesen und vergleichen.
Ich weiß ja nicht was du da kontrollieren willst, aber in diesen Beispiel würde das Js sofort stoppen wenn er bei einer Id ankommt die es nicht gibt.
Das könnte man mit fast allen machen.
Ohne setTimeout würde das Script ca 500 mal was kontrollieren ( vergleichen ) in der Minute was du per Hand nicht schaffen kannst.
 
Zuletzt bearbeitet:

rernanded

Erfahrenes Mitglied
@basti 1012 Nein in zwei Dateien. Ich habe nur sämtliche Scriptteile zusammengefasst.
Dein Beispiel ist genau richtig und funktioniert gut. Nur dass der jeweilige vorherige Datensatz nicht angezeigt werden soll, es wird also am besten immer nur ein Datensatz, nämlich der der aktuell aufgerufenen id angezeigt.
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
$pdo = new PDO("mysql:host=$host;port=$port;dbname=$dbname", "$username", "$password");
Die Quotes um username und password sind übrigens unnötig. Du brauchst ja hier keine Stringinterpolation.

$pdo->prepare(" SELECT * FROM wow WHERE id = $id ");
Hier nutzt du zwar Prepared Statements, aber leider zeigt das, dass du das eigentliche Problem (SQL Injections) nicht verstanden hast. Es geht um naive Stringinterpolation, die du hier immer noch tust. Jedes gute Tutorial für Prepared Statements im Internet sollte das gut erklären.
 

Neue Beiträge