GithubHelp home page GithubHelp logo

Comments (35)

steampixel avatar steampixel commented on June 10, 2024 1

Hi,

ich würde das nicht in die Session packen. Denn die Unterseiten können theoretisch ja auch aufgerufen werden, wenn du vorher nicht schon auf der Übersichtsseite warst. Dann musst du dir ja wieder was bauen, dass wenn ein Wert in der Session fehlt, du wieder auf die Übersicht leitest oder sowas, damit das alles richtig initialisiert wird.

Warum registrierst du nicht für jede Stadt mehrere Routen? Das Schema (Name der Unterseiten) ist doch sicher immer gleich oder? Also, dass du in jedem Schleifenduchlauf die Hauptseite regisitrierst und dann gleich noch die Unterseiten:

while(...) {
Route::add('/'.strtolower($newcityname).'/edit', function() {
...
    });
Route::add('/'.strtolower($newcityname).'/details', function() {
...
    });
Route::add('/'.strtolower($newcityname).'/do-something', function() {
...
    });
}

Alternativ (Was ich empfehlen würde, weil es bestimmt viele Städte gibt) klannst du auch "Actions" nutzen. Also einen zweiten Parameter, der den Typ der Unterseite steuert:

Route::add('/([a-z0-9-_]*)/([a-z0-9-_]*)')', function($city, $action) {
   
// Select this city from db

// Switch the action
switch ($action) {
    case 'edit':
        // edit this city
        break;
    case 'details':
        // Show city details
        break;
    case 'do-something':
        // Mach irgendwas
        break;
}

  }, ['get']);

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

Lol^^ My auto-responder sends automatic answers to github ^^
The Variable $v should be available inside member.php because its the same scope.
Just do not define it in member.php! Just use it.

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

Hab ich versucht aber kein wert wird übermittelt

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

die variable v ist dann leer

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

kannst du die variable denn vor dem include ausgeben?

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

ja vor dem include klappt es aber ich würde diese gerne der datei übergeben, ansonsten muss ich immer mit ?id=1 oder session arbeiten..

from simplephprouter.

btinet avatar btinet commented on June 10, 2024

Ich hatte da mal ein MVC basierend auf diesem Router und dem damaligen Simple MVC entworfen. Damit lassen sich GET und POST bequem an die aufzurufende Methode des jeweiligen Controllers übergeben. Bei Bedarf suche ich mal das Projekt raus.

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

Seltsam. Include tut nichts anderes, als den Code dort rein zu pasten. Sicher, dass du die Variable nicht innerhalb einer Klasse oder Funktion verwendest? Dann musst du sie erst mit Global verfügbar machen. Ansonsten versuche mal diese ähnlich wie in der Antwort oben in ein superglobales Array zu kopieren: _GET['var'] = $var; Und dann nimmst du in deiner Include den Wert aus _GET.

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

Es muss natürlich $_GET heißen.

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

asooo ich hab nur $id=$v aufgerufen, ich versuch es mal mit get^^

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

ja das muss aber trotzdem gehen. Das hat auch nix mit dem Router zu tun denke ich. mach dir doch mal ein testfile und Include darin ein anderes testfile. dann setze in dem patent file eine variable. die sollte dann im child file enthalten sein.

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

klappt aber auch nicht
habe die route http://127.0.0.1/app/test/1
Route::add('/app/test/([0-9]*)', function($v) { include('test.php'); }, ['get','post']);

innerhalb der test.php

$v = $_GET['v']; echo 'Hallo Variable '.$v;

und auch wie du geschrieben hattest folgendes probiert
$_GET['v'] = $v;

from simplephprouter.

 avatar commented on June 10, 2024

if you want to pass an external variable into the function() {}, you can do this:
Route::add('/app/test/([0-9]*)', function($v) use ($external) { echo $external; include('test.php'); }, ['get','post']);

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

so i can use it in test.php?

from simplephprouter.

 avatar commented on June 10, 2024

Before doing any includes and anything, try echoing the variables... you'll see what passes and what's not.

$_GET & $_POST doesn't have to be passed on, it's in the Global scope by definition.
If you want to pass a $v variable that is in your route script PHP page, then you can use what I've said earlier. it is working, i often use this way to pass global config and extra variables that doesn't come from the query from route:add() path.

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

dont work by me

from simplephprouter.

 avatar commented on June 10, 2024

what doesn't work? try this to debug yourself:
Route::add('/app/test/([0-9]*)', function($v) { echo "this value is: ".$v."<br>"; }, ['get','post']);

  • goto http://127.0.0.1/app/test/1
  • If you don't see a response like "this value is: 1" on your screen, then the route didn't go there in your script... maybe you already have another regex before that catch it? whats the response? a 404? etc?

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

OK. I think this is a confusing topic. I have found this: https://stackoverflow.com/questions/4675932/passing-a-variable-from-one-php-include-file-to-another-global-vs-not
The guys there are also confused. Please try to global $var; inside your member.php. If this should work please report your PHP Version and a copy of your PHP.ini. Maybe some PHP Versions or configurations cannot access variables inside includes that was defined in other includes without global them.

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

here is the same Problem again. https://stackoverflow.com/questions/30346991/variable-not-accessible-in-included-php-file
This sounds like some kind oft a PHP bug for me.

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

hi. ich kannst leider gerade nicht testen. bin noch 2 Wochen ohne Rechner unterwegs.

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

Alles gut hat keine eile, würde mich aber in Zukunft Interessieren wie man da weiter vor geht

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

Ach ich hätte zusätzlich noch eine Frage, ich würde gern ein bestimmten teil der Routen Datenbank basiert machen, sprich das du eigene Routen anlegen kannst, quasi wie ein cms wenn man eine neue Unterseite anlegen möchte, allerdings bin ich etwas ratlos wie ich da anfangen soll. Vielleicht ein Tipp für mich ?

from simplephprouter.

btinet avatar btinet commented on June 10, 2024

Route host/foo/bar

Innerhalb der aufgerufenen Funktion foo dann mit der Variable bar den Content laden.

Wenn bar in der Datenbank nicht existiert entsprechend umleiten.

So würde ich es wohl machen.

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

verstehe, dachte es gibt da noch eine andere möglichkeit aber das reicht schon.

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

Hi @Nex4T ,
zu deinem Problem: Folgendes klappt bei mir komplett ohen Probleme. Auszug aus meiner index.php:

Route::add('/member/([0-9]*)', function($v) {
  include('member.php');
}, ['get','post']);

Die Datei member.php:

<?php
echo $v;

Die URL http://localhost/test/member/7 gibt mir einfach "7" im Browser aus. Wie erwartet. Bitte schreibe mir doch nochmal, um welche PHP-Version es sich bei dir handelt. Ich habe bei mir gerade PHP 7.2 laufen.

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

@Nex4T Zu deiner Datenbank-Frage:

Du hast generell einige verschiedene Möglichkeiten:

  1. Nutze statische Ruten, wo sie gebraucht werden. Zum Beispiel legst du ja routen wie /login oder /admin nicht in die Datenbank, weil die ja immer gleich sind.

  2. Nutze komplett dynamische Routen aus der Datenbank. Angenommen du hast eine Tabelle "Pages", so könntest du in dem Feld "slug" einfach den Kompletten Pfad speichern. Im PHP machst du dann eine Querry und liest alle Datensätze aus der Tabelle aus Du kannst dann über diese iterieren und Route::add dann dynamisch aufbauen. Pseudocode:

foreach($pages as $page) {
  Route::add($page['slug'])', function($v) {
    // load your theme and push the page data to it
  }, ['get']);
}
  1. Nutze Teildynamische routen. Angenommen du hast einen Blogbereich so liegen die Beiträge evtl. immer unter /blog. In der entsprechenden Tabelle speicherst du nun nur den Teil-Slug des Blogposts. Also zum Beispiel "mein-toller-artikel-uerber-php". Dann gehst du ähnlich vor wie bei Punkt 2 und registrierst alle blog-beiträge als route. Pseudocode:
foreach($posts as $post) {
  Route::add('/blog/'.$post['slug'])', function($v) {
    // load your theme and push the post data to it
  }, ['get']);
}

Mit wachsender Zahl an Seiten oder Posts werden die Methoden 2 und 3 halt langsam, weil immer alles aus den Tabellen geladen und als Route registriert wird. Darum kannst du dir auch überlegen das System umzukehren und nur eine Route für den Blog anlegen. Pseudocode:

Route::add('/blog/([a-z0-9-_]*)')', function($slug) {
    // load only this post
    // SELECT * FROM post WHERE slug = $slug (Note: Use mysqli to escape the $slug string for security reason!)
    // Trigger your own 404 logic if the slug was not found
  }, ['get']);

Wie du siehst gibt es viele Wege. Es kommt eben darauf an, was du genau machen willst. Letztendlich werden sich diese Methoden in einem Projekt evtl. auch mischen.

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

Grüß dich,
hab das hier relativ spät gesehen, hab jetzt folgendes gemacht

`if ($result2 = $con->query($query2)) {
while ($row2 = $result2->fetch_assoc()) {

    $townname = utf8_encode($row2["name"]);
    $search  = array('ö', 'ä', 'ü', 'Ö', 'Ä', 'Ü', ' ');
    $replace = array('oe', 'ae', 'ue', 'oe', 'ae', 'ue', '-');
    $newcityname = str_replace($search, $replace, $townname);

    Route::add('/'.strtolower($newcityname), function() {
        $_SESSION['townname'] = $newcityname;
        $townname = $_SESSION['townname'];
        frontendHead($townname);
        frontendNavi($townname);
        frontendContentExplorer('startseite');
        frontendFooter();
        frontendEnd();
    });
}
$result2->free();

}
`
nur wie kann Ich jetzt fixen routen auch was übermitteln? Iach brauch die daten aus der db jeweils in der Session, wenn ich z.b auf den link /muenster klicke brauch ich münster in der session

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

Hey. Ich habe absolut keine Idee, warum du beim Routing die Session brauchen solltest.

from simplephprouter.

btinet avatar btinet commented on June 10, 2024

Angenommen der Link citi/muenster wird aufgerufen, wäre es dann nicht sinnvoll, wenn man den Namen der Stadt aus der Datenbank mithilfe des Links abruft?

Zum Beispiel

Id 1
slug muenster
name Münster

Dann müsste man auch nichts im String ersetzen. Ich würde dann auch eher die id in der Session speichern, um später weitere Daten aus der entsprechenden Zeile zu holen.

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

ja gut das könnte ich auch machen mit der id aber die wird nicht übernommen, das ding ist hinter jeder stadt stecken noch viele andere daten, wie ich jetzt was speicher um an die daten zu kommen ist eigentlich egal, ich brauche sie halt einfach, nur das ding ist ich kann nach wie vor nichts übergeben

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

Also vorher hab ich es so gemacht

Route::add('/(.*)', function($v) {

hat auch Funktioniert, allerdings wenn ich jetzt etwas eingebe was nicht in der Datenbank steht wie z.b /google, wird die Route trotzdem ausgeführt halt ohne ausgaben dahinter .

deswegen dachte ich mir ich mache es wie im beispiel lasse es über eine schleife ausgeben und jeweils bei der Route id oder name ( was für mich keine relevanz hat ) der stadt in eine session speichern das ich anschließend damit weiter arbeiten kann, auf allen anderen subpages etc.

mein Problem ist nun da ich ja jetzt feste Routen setze krieg ich den wert nicht mehr in die Session

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

Was willst du denn genau übergeben? Hast du ein Formular oder so? Oder Mehrere Formulare auf mehreren aufeinander folgenden Seiten? Ich verstehe das Problem noch nicht ganz. Ich würde dir bei sowas aber empfehlen die Daten zunächst im Frontend zu sammeln (JavaScript und LocalStorage) und dann alles am Ende an eine einzige Api zu posten. Das macht alles sauberer.

from simplephprouter.

Nex4T avatar Nex4T commented on June 10, 2024

In erster Linie möchte ich nur den Stadtnamen im Link sowie im Content haben, alles weitere kann ich ja dann dort verarbeiten, ich lasse ja jetzt in der Schleife die Routen ausgeben nur bekomme ich danach den Stadtnamen nicht mehr im Content rein. Die variable $stadt würde ich gerne auf der unterseite ausgeben lassen aber funktioniert nicht, deswegen wollte ich das ja in die Session packen.

`if ($result2 = $con->query($query2)) {
while ($row2 = $result2->fetch_assoc()) {

    $townname = utf8_encode($row2["name"]);
    $search  = array('ö', 'ä', 'ü', 'Ö', 'Ä', 'Ü', ' ');
    $replace = array('oe', 'ae', 'ue', 'oe', 'ae', 'ue', '-');
    $newcityname = str_replace($search, $replace, $townname);

    Route::add('/'.strtolower($newcityname), function() {
        $stadt = $newcityname;
        frontendHead($newcityname);
        frontendNavi($newcityname);
        frontendContentExplorer('startseite');
        frontendFooter();
        frontendEnd();
    });
}
$result2->free();

}
`

from simplephprouter.

schlossmacher123 avatar schlossmacher123 commented on June 10, 2024

i have the same problem, i cant use vars out of the route in the route

$fortest = '1'; Route::add('/test', function ($v) { echo $fortest; echo 'hallo'; }, ['get', 'post']);

dont work

from simplephprouter.

steampixel avatar steampixel commented on June 10, 2024

@schlossmacher123 Please refer to this solution: #31

from simplephprouter.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.