Johannes: Mehrere Datenbankzugriffe

Hallo!

Ich greife per ODBC auf eine Datenbank zu. Der Zugriff funktioniert im Script wunderbar, solange eine Verbindungskennung offen ist.
Sind aber 2 offen (auch unterschiedliche Variablennamen), dann verhaspelt er sich irgendwie. Kann mir jemand erklären wieso? Hier ein Beispielcode:

function check_id($nr)
{
  $c_id = odbc_connect(sln,user,pw);
  $query = "SELECT * FROM hans WHERE hans_ID=".$nr;
  $e_id = odbc_exec($c_id, $query);
  while(odbc_fetch_row($e_id))
  {
    ...
  }
  odbc_close($c_id);
}

$c = odbc_connect(sln,user,pw);
$query = "SELECT * FROM fritz;
$e = odbc_exec($c, $query);
while(odbc_fetch_row($e))
{
  check_id(odbc_result($e,1));
}
odbc_close($c);

Fakt ist, dass nur ein Ergebnis aus der Abfrage in der fritz-Tabelle überprüft werden kann, bei den anderen tritt ein Fehler in der Zeile "while(odbc_fetch_row($e))" auf und somit das Skript beendet wird.

  1. Sup!

    Vielleicht würde es helfen, zu wissen, auf welche Datenbank Du zugreifst.

    Gruesse,

    Bio

    --
    Tötet DJ Ötzi! (Nicht wirklich!)
    1. Vielleicht würde es helfen, zu wissen, auf welche Datenbank Du zugreifst.

      ODBC ist ODBC, ob jetzt mit nem Access oder SQLite Treiber... weiß nicht wo da ein unterschied ist (außer vielleicht dass die Ergebnisse von SQLite Qualitativer sind). Ich nutz aber den deutschen Access-Treiber.

  2. Hallo!

    Sind aber 2 offen (auch unterschiedliche Variablennamen), dann verhaspelt er sich irgendwie. Kann mir jemand erklären wieso? Hier ein Beispielcode:

    Vielleicht handelt es sich um asynchrone Verbindungen?

    Beste Grüße
    Viennamade

    1. Vielleicht handelt es sich um asynchrone Verbindungen?

      Kann ich nicht sagen, da ich noch nie begriffen habe wie sich asynchrone bzw. synchrone Verbindungen auswirken. Kannst du mir das erklären?

      1. Hallo!

        Vielleicht handelt es sich um asynchrone Verbindungen?

        Kann ich nicht sagen, da ich noch nie begriffen habe wie sich asynchrone bzw. synchrone Verbindungen auswirken. Kannst du mir das erklären?

        Bei auf asynchrone Verbindungen abgesetzte Abfragen wird der Quellcode weiter interpretiert obwohl das Abfrageergebnis noch nicht komplett ist. Also während sich in der Variablen $x noch Daten ansammeln wird zu i die Ziffer 1 bereits dazugezählt:

        $x = "SELECT * FROM INTERNET"
         i = i+1

        Folgt jetzt eine asynchrone DB-Abfrage einer anderen so werden die zeitgleich durchgeführt, daher ist beim Scripten/Programmieren auf eine Trennung der Ressourcen zu achten.

        Beste Grüße
        Viennamade

        1. Hm, ne, also die Daten sind schon zu dem Zeitpunkt da. Der erste Check funktioniert ja auch, aber jeder weitere verläuft ins nirvana, da odbc_fetch_row($e) meckert, es wäre keine gültige Verbindungskennung da.

  3. Hi,

    was ist der Grund, dass Du zwei Verbindungen oeffnest?

    Gruss,
    Ludger

    1. was ist der Grund, dass Du zwei Verbindungen oeffnest?

      Weil ich eben die Seperate Funktion dazu brauche und ich net ständig dieses $c mit übergeben möchte. (Oder täusch ich mich und alle Variablen die vorher schon irgendwo gesetzt wurden sind in der Funktion auch verfügbar?!?!)

      Und das "SELECT * From fritz" ist nur ein Beispiel. Die Abfragen und auch die INSERTS, UPDATES und DELETES funktionieren ja alle tadellos.

      1. Hi!

        Weil ich eben die Seperate Funktion dazu brauche und ich net ständig dieses $c mit übergeben möchte. (Oder täusch ich mich und alle Variablen die vorher schon irgendwo gesetzt wurden sind in der Funktion auch verfügbar?!?!)

        Variablen aus dem globalen Namensraum sind über $GLOBALS['name'] überall verfügbar. Siehe auch: http://de3.php.net/manual/de/reserved.variables.php#reserved.variables.globals

        Wobei das eigentlich dem Prinzip der Kapselung der Funktionen widerspricht.

        Daher würde ich eigentlich eher eine Klasse hierfür verwenden, da kannst Du die Verbidungskennung als Eigenschaft der Klasse speichern und nutzen, oder wenn Du eben funktionen verwenden willst, dann könnstest Du eine Wrapper-Funktion basteln, das heißt, Du rufst die query-Funktion nicht direkt auf, sondern über über eien Funktion wie:

        function db_query($sql) {
          static $conn;
          if (!$conn) {
            $conn = odbc_connect(...);
          }
          return odbc_exec($conn,$sql);
        }

        das nur mal als Idee. Ist ungetestet, nur um das Prinzip zu erklären. Mit einem Objekt geht das natürlich noch etwas netter.

        Und das "SELECT * From fritz" ist nur ein Beispiel. Die Abfragen und auch die INSERTS, UPDATES und DELETES funktionieren ja alle tadellos.

        Aber Probleme dieser Art (Querys in einer Schleife) deuten meist auf ein suboptimales Datenbank-Design hin. Ich würde versuchen das ganze über einen JOIN in SQL abzubilden, natürlich muss dann auch die Datenstruktur hierzu passen. Ich hoffe nicht dass Du für jeden User eine eigene Tabelle hast, oder sowas...

        Grüße
        Andreas

        --
        SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/
  4. Hi,

    $query = "SELECT * FROM fritz;

    das sieht nicht gut aus.

    Gruss,
    Ludger