Wielokrotne wykonywanie skryptu php

0

Witam.
Technologia której używam opiera się na takim szablonie.

<script src="EBSetupEx.js"></script>
<script>
class myApp{
constructor(){ /* kod stronu w JS*/}}
setTimeout(function(){my_new_shining_app = new myApp();},300);
</script>

kiedy generuje to za pomocą php skrypt się wykonuje 2 razy.

np.

<script src='EBSetupEx.js'></script>
<script defer>



<?php  
 
  echo "class app{constructor(){ElementBuilder.setWorkplace();";

  echo "window.top.myApp.log_window.add_log('Error creating table ');";
  
$currentDate = date('Ymd');
$currentTime = date('His');
  $z=$currentDate.$currentTime;
  echo "window.top.my_table='$z';document.documentElement.owner=window.top;";
  
  
  
$servername = "****";  // Replace with your MySQL server name
$username =   "****";     // Replace with your MySQL username
$password = "****";     // Replace with your MySQL password
$database = "****";     // Replace with the name of your MySQL database
  
$conn = new mysqli($servername, $username, $password, $database);

if ($conn->connect_error) {
    echo "document.body.innerHTML = '<label style=\"font:20px italic arial,serif;color:red;height:50%;width:70%;\">Not connected!</label>';";<br>
    die("Connection failed: " . $conn->connect_error);
} else {
    echo "document.body.innerHTML = '<label style=\"font:20px italic arial,serif;color:red;height:50%;width:70%;\">Connected!</label>';";
}
$kkk = "";
$sql = "CREATE TABLE `" . $z . "` (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL)";

if ($conn->query($sql) === TRUE) {
    $kkk = $kkk." document.body.innerHTML += '<label style=\"font:20px italic arial,serif;color:red;height:50%;width:70%;\">Table created<br> successfully</label>';window.top.myApp.log_window.add_log('Table with id $z created successfully');";
   $kkk = $kkk."window.top.my_table = '$z';";
    $kkk = $kkk."window.top.myApp.info_window.window.buttons[0].innerText = '$z';";
   $kkk = $kkk. "window.top.myApp.info_window.window.buttons[1].childNodes[0].value = '$z';";
} else {
    $kkk = $kkk."document.body.innerHTML = '<label style=\"font:20px italic arial,serif;color:red;height:50%;width:70%;\">Error creating table: " . $conn->error . "</label>';window.top.myApp.log_window.add_log('Error creating table $conn->error');";
}
echo $kkk;
$conn->close();
  
  echo "}}setTimeout(function(){myApp  = new app();},300);";

?>

setTimeout(function(){myApp = new app();},300);</script>
    

Pytania 2 - czemu tak się dzieje i czy może się uruchamiać to regularnie?

Wynik działania po jednym przesłaniu formularza to

2023-7-9 10:46:15 Table with id 20230709104614 created successfully2023-7-9 10:46:15 Table with id 20230709104614 created successfully

Zdublowane za każdym razem.

6

JS generowany jako echo. Nazwy Tabel tworzone jako czas. Tu nie ma co się zastanawiać czemu to działa nieprzewidywalnie, to trzeba zaorać na tym etapie.

0

No, a mają być dynamicznie tak tworzone odpowiedzi na zapotrzebowanie l usuwane po zakończeniu pracy. I nie dodałeś i html tworzony z JS.

@jurek jest taka kwestia, że zamieniłem setTimeout(function(){myApp = new app();},300); ostatnie na setInterval(function(){myApp = new app();},300); i się odświeża

3

To jest najgorzej napisana aplikacja jaką widziałem w życiu.

  1. Po pierwsze, masz błąd składniowy tutaj
    "...</label>';";<br>
    
    <br> powinno być najpewniej wewnątrz cudzysłowu
2

Jak już mówiłem, chciałbym wziąć kod napisany przez @johnny_Be_good który jest absolutną abominacją jakiegokolwiek podejścia programistycznego, bo to jest chyba najgorzej napisany kod jaki tylko mógłby być. Obciążony jest takimi błędami jak:

  • Tworzy tabele które mają aktualny czas, kilka razy na sekundę (czyli np za godzinę będzie tam ponad 4000 tabel)
  • Nie używa json_encode() ani htmlEntities() do renderowania widoku JS oraz HTML (co jest konieczne)
  • Kiedy już renderuje widok, to zamiast zbudować normalnie ten widok używając <template> albo document.createElement(), buduje składnie używają .innerHtml, i to jeszcze pomieszanie języków JavaScript i PHP, co aż się prosi żeby gdzieś pominąć cudzysłów.
  • Sam kod cały jest pomieszany, SQL, HTML, PHP i JavaScript - tragedia
  • Cały design jest niepoprawny, bo całość powinna być napisana po prostu z Ajaxem.

To co ja zamierzam tutaj zrobić, to jest wziąć ten kod z wszystkimi błędami projektowymi jakie tam są, i po prostu przepisać go - tzn. kod będzie działał nadal tak jak działa, tylko będzie lepiej napisany, zrefaktorowany. To co zrobiłem to:

  • Użyłem w odpowiednim miejscu json_encode() tam gdzie PHP wsadza coś do JS'a, oraz htmlEntities() tam gdzie PHP wsadza coś do HTML'a
  • Wyniosłem logikę wyżej, a widok został na dole - z renderowaniem tylko odpowiednich zmiennych w widoku
  • Nadałem odpowiednie nazwy zmiennym
  • Połączyłem dwa date() w jedno, bo nie ma potrzeby żeby były dwa.

Wersja przed - w pierwszym poście: Wielokrotne wykonywanie skryptu php

Wersja po:

<?php
$tableName = date('YmdHis');
$conn = new mysqli('hostname', 'username', 'password', 'database');

$createdTable = $conn->query("CREATE TABLE `$tableName` (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL)") === true;
$connectionStatus = $conn->connect_error ? 'Not Connected!' : 'Connected!';
$creationError = $conn->error;
$conn->close();
?>

<style>
    label.message {
        font: 20px italic arial, serif;
        color: red;
        height: 50%;
        width: 70%;
    }
</style>

<script src='EBSetupEx.js'></script>
<script defer>
    class app {
        constructor() {
            ElementBuilder.setWorkplace();
            window.top.myApp.log_window.add_log('Error creating table ');
            window.top.my_table = <?= json_encode($tableName); ?>;
            document.documentElement.owner = window.top;
            document.body.innerHTML = '<label class="message"><?= $connectionStatus ?></label>';

            <?php if ($createdTable):  ?>
                document.body.innerHTML += '<label class="message">Table created<br> successfully</label>';
                window.top.myApp.log_window.add_log('Table with id $tableName created successfully');
                window.top.my_table = <?= json_encode($tableName) ?>;
                window.top.myApp.info_window.window.buttons[0].innerText = <?= json_encode($tableName) ?>;
                window.top.myApp.info_window.window.buttons[1].childNodes[0].value = <?= json_encode($tableName) ?>;
            <?php  else: ?>
                document.body.innerHTML = '<label class="message">Error creating table: <?= htmlEntities($creationError) ?> </label>';
                window.top.myApp.log_window.add_log('Error creating table <?= htmlEntities($creationError) ?>');
            <?php endif; ?>
        }
    }

    setInterval(function () {
        myApp = new app();
    }, 300);
</script>

Każdy kto przeczyta obie wersje, będzie w stanie stwierdzić która jest czytelniejsza. Przy czym to nawet nie jest ostateczny krok, bo to jest tylko refaktor tej okropnej implementacji. Cały design tej aplikacji nadal jest bardzo słaby, bo tego się w ogóle nie tak powinno robić. Dużo lepszy wyjściem byłby AJAX.

Gdyby ktoś faktycznie chciał stworzyć aplikacje, która przypomina to co @johnny_Be_good chciał napisać, to powinno wyglądać to tak:

<html lang="en">
<head>
    <title>Application</title>
    <style>
        label.message {
            font: 20px italic arial, serif;
            color: red;
            height: 50%;
            width: 70%;
        }
    </style>
</head>
<body>
<label id="message" class="message"></label>
<button id="button"></button>
<p>Table name: <span id="tableName"></span></p>

<script>
    window.addEventListener("load", main);

    function main() {
        setInterval(refresh, 300);
    }

    function refresh() {
        fetch("/file.php")
            .then(response => response.json())
            .then(response => response(response.success, response.message, response.tableName))
            .catch(console.error);
    }

    function response(success, message, tableName) {
        window.top.my_table = tableName;
        
        const messageLabel = document.getElementById("message");
        const tableNameSpan = document.getElementById("tableName");
        const button = document.getElementById("button");
        
        messageLabel.innerText = message;
        tableNameSpan.innerText = tableName;
        button.innerText = tableName;

        if (success) {
            window.top.myApp.log_window.add_log(`Table with id ${tableName} created successfully`);
        } else {
            window.top.myApp.log_window.add_log('Error creating table ' + message);
        }
    }
</script>
</body>
</html>
<?php

function main()
{
    $tableName = date('YmdHis');
    $conn = new mysqli('hostname', 'username', 'password', 'database');

    if ($conn->connect_error) {
        return [
            'success'   => false,
            'message'   => 'Connection error',
            'tableName' => null
        ];
    }
    $createdTable = $conn->query("CREATE TABLE `$tableName` (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL)") === true;
    if ($createdTable) {
        return [
            'success'   => true,
            'message'   => 'Table created successfully',
            'tableName' => $tableName
        ];
    }
    return [
        'success'   => false,
        'message'   => $conn->error,
        'tableName' => null
    ];
}

echo json_encode(main());

0

@Riddle a możesz mi jeszcze poprawić ten kod (tak żeby ludzie wiedzieli, jak to powinno być) bo to jest ramka tworząca nową tabele - króciutki banał, a co powiesz o tym?


<script src="EBSetupEx.js"></script>
<script defer>


class application{

constructor(){
ElementBuilder.setWorkplace();
document.body.style.alignItems="flex-start";
document.body.style.overflow="hidden";
document.documentElement.style.overflow="hidden";
document.body.style.backgroundColor="black";
document.documentElement.style.backgroundColor="black";
document.documentElement.style.border="0px solid black";

////////////////////////////////////////////////////////////  UPPPER BAR


var upper_bar_style = "display:flex;justify-content:flex-start;background:linear-gradient(to right, #000022,#000011);color:white;width:25%;height:99.8%;font:italic 19px arial,serif;align-items: center;border-radius:3px;opacity:0.9;border:1px solid green;";
this.upper_bar_style_max= upper_bar_style;
this.info_window = new ButtonBar("display:flex;flex-direction:row;position:absolute;top:0%;left:0%;justify-content:center;align-items:center;color:white;border:0px solid white;width:99.99%;height:6%;","status_bar_class",11,["my_table","","my_table","","nr","0","con_frame on","init","start","pause","log"],[null,null,null,null,null,null,null,null,null,null,null],[upper_bar_style,upper_bar_style],this,document.documentElement);
this.info_window.remove_defaults();

for(let i=0;i<11;i++){this.info_window.window.buttons[i].style.width="10%";}

this.info_window.window.buttons[0].style.width="25%";
this.info_window.window.buttons[1].style.width="25%";
this.info_window.window.buttons[6].style.width="20%";

this.info_window.remove_defaults();
for(let i=0;i<6;i++){this.info_window.window.buttons[i].style.cursor="default";}
for(let i=6;i<11;i++){this.info_window.window.buttons[i].style.cursor="pointer";this.info_window.window.buttons[i].setAttribute("onMouseOver","this.style.background='linear-gradient(to right, #220022,#770000)';");this.info_window.window.buttons[i].setAttribute("onMouseOut","this.style.background='linear-gradient(to right, #000022,#000011)';");}



this.info_window.window.buttons[1].innerHTML="<input style='font:20px italic arial, serif;width:100%;height:100%;color:black;display:flex;z-index:22;'></input>";


this.info_window.window.buttons[0].style.width="26%";


////////////////////////////////////////////////////////////// CONNECTING FRAME

this.connecting_frame = ElementBuilder.createElement("IFRAME","display:flex;position:absolute;bottom:0%;right:0%;height:10%;width:18%;border:1px solid RGB(22,22,22);background:lightGrey;color:white;align-items: center;justify-content: center;font:24px italic arial,serif;opacity:0.8;","connecting_frame_class",this,document.body,false).setAttribute("srcdoc","").element;


this.log_window = ElementBuilder.createElement("DIV","display:none;justify-content:flex-start;position:absolute;bottom:0%;right:0%;height:10%;width:18%;border:1px solid RGB(22,22,22);background:lightGrey;color:white;align-items: center;justify-content: center;font:24px italic arial,serif;opacity:0.8;","log_window_class",this,document.body,false).element;



this.connecting_frame.con_settings = "<form action='connect_new.php' method='POST'><button type='submit'>start</button></form>";

this.connecting_frame.connect = function(){this.setAttribute("srcdoc",this.con_settings);setTimeout(function(){window.myApp.connecting_frame.contentWindow.document.querySelectorAll("BUTTON")[0].click();return 0;},300);};




this.info_window.window.buttons[6].setAttribute("onClick","if(window.myApp.connecting_frame.style.right=='0%'){this.innerText='con_frame off';window.myApp.connecting_frame.style.right='-50%';}else{this.innerText='con_frame on';window.myApp.connecting_frame.style.right='0%';};");
this.connecting_frame.style.right='0%';



this.info_window.window.buttons[10].setAttribute("onClick","if(window.top.mes==0){window.top.form = MBox('','');window.top.form.only_attributes(['style'],['display:block;position:absolute;width:80vw;top:9%;border:2px solid grey;height:70%;overflow:auto;left:9%;']).only_text(window.top.myApp.log_window.innerText).only_style('white','black');}else{window.top.mes=0;window.top.form.tz.remove();}");

this.info_window.window.buttons[7].setAttribute("onClick","window.myApp.connecting_frame.connect();");

this.connecting_frame.setAttribute("srcdoc",this.connecting_frame.con_settings);


//z.element.

setTimeout(function(){

window.top.myApp.log_window.add_log = function(txt){
//alert(get_time());
window.top.myApp.log_window.innerText+=get_time();
window.top.myApp.log_window.innerText+="\t"+txt+"\n";
//window.top.myApp.log_window.innerText+=get_time()+txt;
//alert(window.top.myApp.log_window.innerText);
}

window.top.myApp.log_window.innerText="";
//window.top.myApp.log_window.add_log("dddd");
},500);





}}


setTimeout(function(){myApp = new application();},300);
</script>

?

To jest wynik http://infinityhost.ct8.pl/php2/

0

Trollowskie pytanie sztucznie napędzające ruch na forum.
Zgłaszam do zamknięcia.

1

Uff chyba w końcu zbanowani tego Johny bi guda. Swoim prostackim i aroganckim zachowaniem tylko zatruwal to forum.

4
johnny_Be_good napisał(a):

if ($conn->connect_error) {
echo "document.body.innerHTML = '<label style="font:20px italic arial,serif;color:red;height:50%;width:70%;">Not connected!</label>';";

To robienie naokoło. Używasz PHP do tego, żeby wygenerować JS, który podmieni HTML.
Po co ci JS w tym momencie? W takim układzie po prostu mógłbyś za pomocą PHP wygenerować bezpośrednio HTML.

echo "class app{constructor(){ElementBuilder.setWorkplace();";

I odwrotnie. Jeśli potrzebujesz JS, to po co w ogóle robisz tu echo? No i JS lepiej przenieść do osobnego pliku JS i go dołączać po prostu (poza ew. elementami, które muszą być dynamiczne. Tj. jeśli kod JS jest taki sam zawsze, to możesz spokojnie to wynieść do osobnego pliku i nie generować za pomocą PHP w ogóle).

Najpierw ja bym uporządkował ten kod, a potem się zastanawiał, co jest nie tak.

 
  echo "}}setTimeout(function(){myApp  = new app();},300);";
?>

setTimeout(function(){myApp = new app();},300);</script>

no ale tutaj renderujesz 2 razy kod do setTimeout, więc pewnie dlatego się 2 razy uruchamia (jeśli mogę się domyślić spoglądając na to na szybko).

0

Tak masz rację, tutaj był błąd. wywaliłem jedna albo dwa i zniknął. Przez zmęczenie doszedłem do wniosku, że skrypt php da się, żeby nie był ładowany z pliku. Echuję JS'a bo chcę, żeby cały kod był generowany przez JS tak jak to jest np. w C++, jak aplikacja to aplikacja, ma być sam kod. Poza tym to są 2 linijki tylko, jak mam postMessage dać to, to potrzebuje js ,to już niech siedzi obok siebie. Zresztą jak będę chciał to utworzyć za pomocą ElementBuildera (ma milion razy większe możliwości) to tutaj modyfikacja zajmie sekundę.

2
johnny_Be_good napisał(a):

"Nowe spojrzenie na sytuację, dzięki :)" - 4 podziękowanie w ciągu 6 miesięcy
xD

Jeśli na CA 700 postów masz 4 podziękowania to użyj skomplikowanej matematyki z podstawówki i oblicz ile razy trafiłeś kulą w płot.
Każdy z nas się uczył, ja tu też nie raz zostałem skrytykowany i to słusznie.

2

@johnny_Be_good: Popatrz na moją wersję tego skryptu:

<?php
$tableName = date('YmdHis');
$conn = new mysqli('hostname', 'username', 'password', 'database');

$createdTable = $conn->query("CREATE TABLE `$tableName` (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL)") === true;
$connectionStatus = $conn->connect_error ? 'Not Connected!' : 'Connected!';
$creationError = $conn->error;
$conn->close();
?>

<style>
    label.message {
        font: 20px italic arial, serif;
        color: red;
        height: 50%;
        width: 70%;
    }
</style>

<script src='EBSetupEx.js'></script>
<script defer>
    class app {
        constructor() {
            ElementBuilder.setWorkplace();
            window.top.myApp.log_window.add_log('Error creating table ');
            window.top.my_table = <?= json_encode($tableName); ?>;
            document.documentElement.owner = window.top;
            document.body.innerHTML = '<label class="message"><?= $connectionStatus ?></label>';

            <?php if ($createdTable):  ?>
                document.body.innerHTML += '<label class="message">Table created<br> successfully</label>';
                window.top.myApp.log_window.add_log('Table with id $tableName created successfully');
                window.top.my_table = <?= json_encode($tableName) ?>;
                window.top.myApp.info_window.window.buttons[0].innerText = <?= json_encode($tableName) ?>;
                window.top.myApp.info_window.window.buttons[1].childNodes[0].value = <?= json_encode($tableName) ?>;
            <?php  else: ?>
                document.body.innerHTML = '<label class="message">Error creating table: <?= htmlEntities($creationError) ?> </label>';
                window.top.myApp.log_window.add_log('Error creating table <?= htmlEntities($creationError) ?>');
            <?php endif; ?>
        }
    }

    setInterval(function () {
        myApp = new app();
    }, 300);
</script>

i sam oceń czy faktycznie nie jest lepiej zrefaktorowana niż Twoja z pierwszego posta?

0

U mnie wszystko jest w JS, a to html, body to tylko po to żeby komunikat się wyświetlał nie w head (bo wtedy nie jest widoczny). Ja wiem ile czasu zajmuje takie bawienie się w ładne dopasowywanie kodu a mam ileś etapów do zrobienia, chcę iść jak najszybciej do przodu.

Ale możesz mi nagrać jak tworzysz coś takiego w 9 minut.

https://www.youtube.com/watch?v=8sm2DWMlwmg

0
johnny_Be_good napisał(a):

U mnie wszystko jest w JS, a to html, body to tylko po to żeby komunikat się wyświetlał nie w head (bo wtedy nie jest widoczny). Ja wiem ile czasu zajmuje takie bawienie się w ładne dopasowywanie kodu a mam ileś etapów do zrobienia, chcę iść jak najszybciej do przodu.

Obejrzyj sobie ten filmik (od 25:32 do 32:10):

0

Może dodaj trochę kolorowania składni do strony?

screent.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1