Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Function in sqlsrv_query() ausführen (UPDATE)

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP Function in sqlsrv_query() ausführen (UPDATE)

    Hallo liebe Community,

    ich möchte eine PHP Funktion in einem SQL Update Befehl ausführen (MSSQL). Ich nutze dazu folgenden Connector: https://docs.microsoft.com/de-de/sql...l-server-ver15 unter Ubuntu (Apache).

    Ich hatte damals ein Projekt in Access, bei dem folgendes ging (VB):
    Code:
    strSQL = "UPDATE Kundennummer_Lat_Lng_Status SET Abstand_temp = CalcDistance(lng, lat, " & lngStadt & ", " & latStadt & ")"
                CurrentDb.Execute strSQL
    Jetzt wollte ich das gleiche in PHP machen:
    PHP-Code:
    $sqlstr "UPDATE Kundennummer_Lat_Lng_Status SET Entfernung = calc_distance(lng, lat, " $latStandort "," $lngStandort ")";

    sqlsrv_query($conn$sqlstr); 
    In $conn sind die DB Daten gespeichert.

    Das ganze scheint so aber nicht zu funktionieren...


    Ich habe bereits eine Lösung, aber die ist ziemlich langsam (ich habe eine Hauptabfrage, welche Lat und Lng aus der Tabelle holt, anschließend berechne ich den Abstand mit der Funktion calc_distance() und mache ein SQL UPDATE mit den Werten):

    PHP-Code:
    $sqlstr "SELECT DISTINCT * FROM [dbo].[MH_Kundensuche_B_Geodaten] RIGHT OUTER JOIN [dbo].[MH_Kundensuche_C_Ergebnis] 
    ON [dbo].[MH_Kundensuche_B_Geodaten].[Kundennummer] = [dbo].[MH_Kundensuche_C_Ergebnis].[Kundennummer]"
    ;

    $stmt sqlsrv_query($conn$sqlstr);

    while(
    $row sqlsrv_fetch_array$stmt))  {  

            
    //Zu jeder Adresse den Abstand berechnen
            
    $entfernung =  calc_distance$row['Lat'], $row['Lng'], $latStandort$lngStandort);

            
    $kundennummer $row['Kundennummer'];

            
    $sqlstr "UPDATE dbo.[MH_Kundensuche_C_Ergebnis] SET [Entfernung] = '$entfernung' WHERE Kundennummer = $kundennummer";

            
    // SQL Statement ausführen
            
    sqlsrv_query($conn$sqlstr);

        } 
    Gruß
    Markus

  • #2
    warum willst Du Daten redundant speichern?
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Ich erkläre dir den Aufbau meines Projekts Mal weiter:

      Es gibt 5 Kundendaten Listen (SICHTEN) (Kundennummer, Adresse). In diesem Tabellen kann die Kundennummer mehrfach vorkommen.

      B_Geodaten (TABELLE) enthält die Kundennummer (einmalig) und die dazugehörigen Geodaten (lat,lng)

      Der Mitarbeiter gibt nun in der Suchmaske an, um welchen Standort und welche Liste es sich handelt. Zu dem Standort werden $StandortLat und $StandortLng geholt (einmalig).

      Die Werte in der B_Geodatentabelle sollen nun um den Abstand aktualisiert werden. Abstand zwischen Adresse (lat, lng) aus der Tabelle und $latStandort, $lngStandort.

      Werte halte ich mir außerdem redundant, da ich dann beim testen einfachere SQL Befehle zur Fehlersuche / Analyse ausführen kann.

      Gruß Markus

      Kommentar


      • #4
        Du machst den update innerhalb einer Schleife, das muss ja langsam sein. Warum verwendest du nicht die GIS-Funktionen von Mysql und berechnest den Abstand zur Laufzeit wenn du ihn brauchst, das ist zudem sehr schnell.
        https://blogs.oracle.com/jsmyth/calc...ata-extensions
        https://dev.mysql.com/doc/refman/8.0...reference.html

        Werte halte ich mir außerdem redundant, da ich dann beim testen einfachere SQL Befehle zur Fehlersuche / Analyse ausführen kann.
        Das ist kein Argument sondern eine Ausrede.

        Kommentar


        • #5
          Ja ich kann mir schon denken das wegen der Schleife so langsam ist.

          Wie soll ich die GIS Funktionen von MySql nutzen wenn ich eine MSSQL DB habe!? Wie ich oben schon beschrieben habe nutze ich dazu einen Connector von Microsoft.

          Ich verstehe auch nicht so ganz das Problem mit meiner DB Struktur? Kannst du mir das genauer erklären? Es ist ja normal das ich nicht alles in eine Tabelle packe sondern trenne - Stichwort Normalform.

          Gruß
          Markus

          Kommentar


          • #6
            Zitat von ichbin15 Beitrag anzeigen
            Wie soll ich die GIS Funktionen von MySql nutzen wenn ich eine MSSQL DB habe!? Wie ich oben schon beschrieben habe nutze ich dazu einen Connector von Microsoft.
            https://spr.com/how-far-geography-da...in-sql-server/

            Kommentar


            • #7
              https://www.php.de/forum/webentwickl...65#post1565565

              Kommentar


              • #8
                Danke für den Link!

                Habe die Abfrage nun wie folgt hinbekommen:

                Code:
                SELECT geography::Point([dbo].[MH_Kundensuche_B_Geodaten].[Lat],[dbo].[MH_Kundensuche_B_Geodaten].[Lng], 4326).STDistance(geography::Point(40.749014,-73.985317, 4326))
                AS Entfernung FROM [dbo].[MH_Kundensuche_B_Geodaten]
                Jetzt frage ich mich aber wie ich die Werte aus Entfernung in die Tabelle [dbo].[MH_Kundensuche_C_Ergebnis] bekomme (dort gibt es die Spalte Entfernung).

                Code:
                UPDATE [dbo].[MH_Kundensuche_C_Ergebnis] SET [Entfernung] = (
                SELECT geography::Point([dbo].[MH_Kundensuche_B_Geodaten].[Lat],[dbo].[MH_Kundensuche_B_Geodaten].[Lng], 4326).STDistance(geography::Point(40.749014,-73.985317, 4326))
                AS Entfernung FROM [dbo].[MH_Kundensuche_B_Geodaten])
                funktioniert nicht, da die Unterabfrage ja mehr als einen Wert zurückgibt.

                Ich steh gerade bisschen auf dem Schlauch.. habt ihr ne Idee?


                Danke und Gruß
                Markus

                Kommentar

                Lädt...
                X