Frenedikt Benzel: Reguläre Ausdrücke in SQL / Fehler mit mysql_num_row

Hallo,

Ich habe da mal ein kleines Problem.

Wenn ich diesen Befehl über die mysql Konsole absetze:
SET @var_regex = REPLACE('i2966.142', 'i', '2%'); SELECT id, sp_id, hostname, sp_location_town, sp_location_street, system_code FROM sheets WHERE sp_id LIKE '@var_regex';

Bekomme ich die gewünschte Rückgabe.

Nun habe ich versucht das Ganze in meine php-Funktion[1] zu übernehmen.
Leider funktioniert das Ganze dann nicht mehr und ich bekomme den Fehler:

"Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /srv/www/htdocs/tnt/web/befrenze/iris_new/functions.php on line 312"

Wäre nett wenn mir einer Helfen könnte.

Grüße
Frenedikt

[1]~~~php

[...]

mysql_select_db("IRIS");
$sql="
  SET @var_regex = REPLACE('$sp_id', 'i', '2%');

SELECT
    id,
    sp_id,
    hostname,
    sp_location_town,
    sp_location_street,
    system_code
  FROM sheets
  WHERE sp_id LIKE '@var_regex';";

echo "<br><br><br>".$sql."<br><br><br>";

if (mysql_num_rows(mysql_query($sql)) > 0)
  {
   [...]
  }
[...]

  
  
  
  

  1. Hi,

    $sql="
      SET @var_regex = REPLACE('$sp_id', 'i', '2%');

    SELECT
        id,
        sp_id,
        hostname,
        sp_location_town,
        sp_location_street,
        system_code
      FROM sheets
      WHERE sp_id LIKE '@var_regex';";

    echo "<br><br><br>".$sql."<br><br><br>";

    if (mysql_num_rows(mysql_query($sql)) > 0)
      {
       [...]
      }

    "Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /srv/www/htdocs/tnt/web/befrenze/iris_new/functions.php on line 312"

    die mysql-Erweiterung von PHP gestattet pro Aufruf von mysql_query() nur *ein* Statement.

    Ciao,
     Martin

    --
    Wer es in einem Unternehmen zu etwas bringen will, muss so tun, als hätte er es schon zu etwas gebracht.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. die mysql-Erweiterung von PHP gestattet pro Aufruf von mysql_query() nur *ein* Statement.

      Also muss das Deklarien der Variabele aus Lagern?

        
      $sql_setvar="SET @var_regex = REPLACE('$sp_id', 'i', '2%');";  
      mysql_query($sql_setvar);  
        
      $sql="  
        
         SELECT  
         id,  
         sp_id,  
         hostname,  
         sp_location_town,  
         sp_location_street,  
         system_code  
         FROM sheets  
         WHERE sp_id LIKE '@var_regex';";  
        
        echo "<br><br><br>".$sql."<br><br><br>";  
        
        if (mysql_num_rows(mysql_query($sql)) > 0)  
        {  
          [...]  
        }  
      
      

      Frenedikt

      1. Hi!

        die mysql-Erweiterung von PHP gestattet pro Aufruf von mysql_query() nur *ein* Statement.
        Also muss das Deklarien der Variabele aus Lagern?

        Nein, deine Variable musst du nicht aus Lagern holen. Aber ja, eine Methode wäre, zwei Statements anzusenden. Die andere wäre der Einsatz von mysqli_multi_query() und der damit verbundene Umstieg auf die mysqli-Extension. Was du auf alle Fälle machen solltest, ist eine Fehlerbehandlung einzubauen, denn abgesehen von solchen vermeidbaren Fehlern, gibt es noch andere Situationen, in denen Querys nicht ausgeführt werden können. Ein robustes Programm fängt diese ab anstatt nur auf Sonnenschein zu hoffen.

        Lo!

        1. Hi!
          Nein, deine Variable musst du nicht aus Lagern holen. Aber ja, eine Methode wäre, zwei Statements anzusenden. Die andere wäre der Einsatz von mysqli_multi_query() und der damit verbundene Umstieg auf die mysqli-Extension. Was du auf alle Fälle machen solltest, ist eine Fehlerbehandlung einzubauen, denn abgesehen von solchen vermeidbaren Fehlern, gibt es noch andere Situationen, in denen Querys nicht ausgeführt werden können. Ein robustes Programm fängt diese ab anstatt nur auf Sonnenschein zu hoffen.

          Das heißt ich darf meine ganzen Funktionen umschreiben :-(

          Aber wenns hilft!

          und wie bastel ich mir die Fehlerbehandlung?

          Frenedikt

          1. Hi!

            Das heißt ich darf meine ganzen Funktionen umschreiben :-(

            Du darfst, wenn du mysqli_multi_query() nutzen willst. Ansonsten eben jedes Statement einzeln absenden.

            und wie bastel ich mir die Fehlerbehandlung?

            Grundlegend, indem du die Rückgabewerte der Funktionen abfragst und sie nicht einfach ungesehen an Folgefunktionen weitergibst. Dann solltest du Überlegungen anstellen, was du dem Anwender im Falle eines Fehlerfalles zu sehen geben willst. Dass das DBMS keine Lust hat, interessiert ihn nicht, geschweige denn eine detaillierte Fehlermeldung dazu. Die darf nur der Administrator sehen. Such also einen Weg, wie der Admin informiert wird. Dann versetz dich in den Anwender, der irgendein Ziel zu erreichen versuchte. Wie kannst du ihm dabei trotz defektem DBMS helfen? Welche alternativen Wege kann er gehen außer dem zur Konkurrenz? Wenn du diese theoretischen Überlegungen angestellt hast, kannst du an die Umsetzung in Programmcode gehen. Und ja, eine Zeile Geschäftslogik und 10 Zeilen "was aber wenn" sind keine Seltenheit. Eine ordentliche Fehlerbehandlung bläht ein Programm ziemlich auf gegenüber einem, das einfach nur geradeaus durchzurennen versucht. Dafür kommt es aber auch in jedem Fall zum Ziel und bleibt nicht mitten auf der Strecke liegen.

            Lo!

      2. Hi,

        $sql_setvar="SET @var_regex = REPLACE('$sp_id', 'i', '2%');";

          
        Es gäb noch eine andere Möglichkeit: mach die Ersetzung innerhalb von PHP und steck das Ergebnis direkt in die Query.  
          
        cu,  
        Andreas
        
        -- 
        [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
        [O o ostern ...](http://ostereier.andreas-waechter.de/)  
          
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
        
        
  2. Hi!

    "Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /srv/www/htdocs/tnt/web/befrenze/iris_new/functions.php on line 312"

    Das ist ein Folgefehler. Der eigentliche Fehler ist bereits bei mysql_query() aufgetreten, aber du hast ihn dort ignoriert. mysql_query() gibt nämlich über seinen Rückgabewert bekannt, ob ein Fehler vorlag oder nicht. Werte diesen aus und frag anschließend mit mysql_error() dein Text der Fehlermeldung ab.

    if (mysql_num_rows(mysql_query($sql)) > 0)

    false ist kein gültiger Wert für mysql_num_rows(), deswegen die PHP-Warnung.

    Wenn du umsteigst auf die mysqli-Extension kannst du dann sogar mit mysqli_multi_query() mehr als ein Statement auf einmal absenden. mit mysql(i)_query() geht immer nur eins auf einmal.

    Lo!

  3. Moin!

    Wenn ich diesen Befehl über die mysql Konsole absetze:
    SET @var_regex = REPLACE('i2966.142', 'i', '2%'); SELECT id, sp_id, hostname, sp_location_town, sp_location_street, system_code FROM sheets WHERE sp_id LIKE '@var_regex';

    Bekomme ich die gewünschte Rückgabe.

    Ich frage mich, warum zum Henker du etwas, was man problemlos in einem einzigen Query hinkriegen könnte, zwingend auf zwei Querys aufteilen willst.

    Dein SET-Statement macht absolut nichts magisches. Du hast einen fixen String, in dem du einen fixen Wert suchst und ihn durch einen fixen anderen Wert ersetzt. Warum das? Warum nimmst du nicht einfach das sich zwingend und garantiert immer wieder identische Ergebnis dieser Operation und verwendest es direkt?

    Wenn du im String 'i2966.142' das i durch '2%' ersetzt, kommt garantiert immer '2%2966.142' heraus.

    Und schon ergibt sich der Query aus dem zweiten Teil, und du hast kein Problem mehr.

    Außer vielleicht: Die Suche mit LIKE sieht das % als Platzhalter für null bis unendlich viele Zeichen. Aber man kann sowas auch escapen und dann nach genau einem Prozentzeichen suchen. Das wiederum würde man dann aber besser hinkriegen, wenn man nicht LIKE verwendet, sondern = für den Vergleich.

    - Sven Rautenberg