Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Abfrage where in

Einklappen

Neue Werbung 2019

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

  • SQL Abfrage where in

    Hallo,

    ich bin ganz neu in PHP, jedoch schon die erste dynamische Seite.

    Ich habe eine Abfrage, die aus einer Oracle Datenbank dynamisch eine Liste erstellt.

    Ich habe eine Variable, die die Kundennummer abfragt. Die Variable wird in die SQL Abfrage wie folgt eingefügt :

    select ..... where Kundennummer in ($knr).

    Sinn: Es können mehrere Kundennummern, getrennt durch "," abgefragt werden.

    Ich bekomme es aber nicht hin, hier alle abzufragen, denn ein where in () funktioniert nicht, ein where in (*) ebenfalls nicht.

    Kann mir jemand einen kleinen Tip geben, danke...

    Cheers


  • #2
    In PHP mit mysql-Db kann das ganze so aussehen:
    PHP-Code:
    <?php
    $arrayWithIDs 
    = array(123);
    $sql 'SELECT * FROM tybelle WHERE id IN (' implode(', '$arrayWithIDs) . ')';
    Kenne mich mit Oracle leider nicht aus. Aber probiers ma aus...
    "My software never has bugs, it just develops random features."
    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

    Kommentar


    • #3
      Hy,

      danke, aber das klappt leider nicht

      Hier mal die beiden Codes

      Code:
      <form action="ma_result.php" method="post">
      Betrieb:
      <select name="btr">
      <option value="1">1</option>
      <option value="2">2 </option>
      <option value="1,2">1,2</option></select><br />
      
      <br>
      Sortierung 
      <select name="sortierung">
      <option value="1">Firma, Name</option>
      <option value="2">Name </option>
      <option value="2">Kunde, Firma, Name </option>
      <option value="2">Kunde, Firma, Name </option>
      <option value="2">Kunde, Firma, geplantes Ende, Name </option>
      <option value="2,1,7,5">testen</option>
      <option value="">ohne</option></select><br />
      <br>
      <br>
      Nur bestimmte Kundennummern abfragen? <input type="checkbox" name="kdjn" value="and augort_kunde in" />
       
      
      Kundennummer: Bitte Kundennummer, getrennt durch ein , eingeben, oder f¸r alle ein * eingeben
      <input type="Text"  name="knr">
      <input type="Submit" value="Abfragen">
      <br>
      PHP-Code:


      <?php

      echo $_POST["btr"];
      echo 
      $_POST["sortierung"];         
      echo 
      $_POST["knr"];     
      echo 
      $_POST["kdjn"]; 

      $btr =  $_POST["btr"];
      $sortierung $_POST["sortierung"];
      $knr $_POST["knr"];
      $kdjn $_POST["kdjn"];

               
      /* oci_fetch_all example mbritton at verinet dot com (990624) */
      $anzahl 0;
      $conn=OCILogon("xxx""xxx""xxx");

      $stmt ociparse($conn"select augort_Btr as Firma, augort_kunde as Kunde, augkun_name1 as Kunde, 
      augort_mitarb as PSNr, P_Name as Name, 
      P_Vorname as Vorname, augort_vorausende as Ende_Geplant, P_befristung as AV_befristung, augort_auftrag1 as Abteilung

      from augort, augkun, personal

      where augort_mitarb=P_nr and augort_btr=augkun_btr and augkun_nr=augort_kunde and augort_ende is null and augort_btr in(
      $btr
      $kdjn ($knr)

      order by 
      $sortierung");
              
      /*$stmt = ociparse($conn, "select P_Nr, P_Name, P_Vorname from personal WHERE P_NR=1");*/

      ociexecute($stmt);

      $nrows ocifetchstatement($stmt$results);
      if (
      $nrows 0) {
         echo 
      "<table border=\"1\">\n";
         echo 
      "<tr>\n";
        
         foreach (
      $results as $key => $val) {
            echo 
      "<th>$key</th>\n";
         }
         echo 
      "</tr>\n";

         for (
      $i 0$i $nrows$i++) {
            echo 
      "<tr>\n";
            foreach (
      $results as $data) {
               echo 
      "<td>$data[$i]</td>\n";
            }
            echo 
      "</tr>\n";
         }
         echo 
      "</table>\n";
      } else {
         echo 
      "No data found<br />\n";
      }
      echo 
      "$nrows Records Selected<br />\n";

      ocifreestatement($stmt);

      ?>
      Übergebe ich die kdjn und kdr, dann ist alles ok. Lasse ich beides frei, so kommt folgende Meldung:

      Code:
      Warning: ociexecute(): OCIStmtExecute: ORA-03001: Funktion nicht implementiert in d:\es\app\htdocs\ma_result.php on line 34
      
      Warning: ocifetchstatement(): OCIFetchStatement: ORA-24374: Definition nicht erfolgt vor Abruf oder Ausführen und Abruf in d:\es\app\htdocs\ma_result.php on line 36
      No data found
      0 Records Selected
      Ich würde mich sehr über hilfe freuen, danke euch.

      Cheers

      Kommentar


      • #4
        Du benutzt für Deine SQL-Abfrage das prepare und execute Konzept. Dabei wird ein SQL-Befehl vorbereitet, parameter reserviert und geprüft (oci_parse), dann die Parameter zugewiesen (oci_bind_by_name) und anschließend ausgeführt (oci_execute). Das geht auch mit MySQL so, nur dass die Funktion dort etwas anderst laufen.

        Beispiel
        Code:
        $knr = 1;
        $p2 = 'Fritz';
        
        $stid = oci_parse($conn, 'SELECT * FROM tabelle1 WHERE knr = :knr AND name = :p2 ');
        oci_bind_by_name($stid, ':knr', $knr);
        oci_bind_by_name($stid, ':p2', $p2, 40);
        
        oci_execute($stid);
        Die Parameter können also nicht einfach mit $knr in den SQL-String eingebunden werden, sondern mit z.B. :knr (also ein eindeutiger Platzhalter, der mit : beginnt).

        Grüße
        Thomas

        Kommentar


        • #5
          Hallo,

          danke für die kompetente Hilfe.
          oci_bind ist ab php 5. Leider können wir nur PHP 4 nutzen.

          ich habe den Code vie folgt geändert:
          PHP-Code:
          $stmt ociparse($conn"select augort_Btr as Firma, augort_kunde as Kunde, augkun_name1 as Kunde, 
          augort_mitarb as PSNr, P_Name as Name, P_Vorname as Vorname, augort_vorausende as Ende_Geplant, 
          P_befristung as AV_befristung, augort_auftrag1 as Abteilung
          from 
          augort, augkun, personal
          where 
          augort_mitarb=P_nr and augort_btr=augkun_btr and augkun_nr=augort_kunde and augort_ende is null and augort_btr in(
          $btr
          :kdjn (:knr)
          order by 
          $sortierung");
          ocibindbyname($stmt':knr'$knr);
          ocibindbyname($stmt':kdjn'$kdjn40); 
          kdjn übergibt and augort_kunde in
          knr die nummer

          Leider kommt dann folgende Fehlermeldung:

          Code:
          Warning: ocibindbyname(): OCIBindByName: ORA-01036: Variablenname/-nummer ungültig in d:\es\app\htdocs\ma_result.php on line 30
          
          Warning: ociexecute(): OCIStmtExecute: ORA-00933: SQL-Befehl wurde nicht korrekt beendet in d:\es\app\htdocs\ma_result.php on line 36
          
          Warning: ocifetchstatement(): OCIFetchStatement: ORA-24374: Definition nicht erfolgt vor Abruf oder Ausführen und Abruf in d:\es\app\htdocs\ma_result.php on line 38
          No data found
          0 Records Selected


          Wenn jemand noch eine Idee hat, ich stehe auf dem Schlauch.

          Danke

          Kommentar


          • #6
            Zitat von powder8 Beitrag anzeigen
            ....
            augkun_nr=augort_kunde and augort_ende is null and augort_btr in($btr)
            :kdjn (:knr)

            order by $sortierung");

            ocibindbyname($stmt, ':knr', $knr);
            ocibindbyname($stmt, ':kdjn', $kdjn, 40);
            [/PHP]
            Der FETT markierte Teil in der SQL-Abfrage syntaktisch falsch. Damit muss auch die $btr Variable auf ocibindbyname() geändert werden.
            Eventuell soll es so..

            Code:
            ...
            augort_btr in(:btr, :kdjn, :knr)
            ...
            lauten, keine Ahnung.

            Grüße
            Thomas

            Kommentar


            • #7
              Weiterhin ist der JOIN in dem SQL syntaktisch falsch...

              Code:
              where augort_mitarb=P_nr 
                 and augort_btr=augkun_btr 
                 and augkun_nr=augort_kunde
              könnte so gemeint sein, bin mir aber nicht sicher, dazu sollte ich die Tabellen kennen.

              Code:
              where augort.mitarb=P_nr 
                 and augort.btr=augkun.btr 
                 and augkun.nr=augort.kunde
              Grüße
              Thomas

              Kommentar

              Lädt...
              X