hawkmaster: Ersatz für mysql_num_rows?

Hallo zusammen,
ich möchte die Anzahl der Einträge einer MySQL Tabelle zählen und gleichzeitig prüfen ob eine Zeile einen bestimmten Wert beinhaltet.
Mit mysql() war bisher alles problemlos.

$result = mysql_query("Select Tname from tabelle1") or mysql_error();
$anzahltab1 = mysql_num_rows($result);
while ($row = mysql_fetch_array($result)){
 if (strtoupper($row['Tname']) == "--------------------"){
  $foundtname = "yes";
 }
}

Ich möchte das gleiche nun mit PDO versuchen. Hier gibt es ja kein "mysql_num_rows".
1. Eine Möglichkeit wäre:

$resultc = $DBO->query("SELECT COUNT(*) AS Tnamecount FROM tabelle1") ;
$rowc = $resultc->fetch();
echo "<br>anzahl ist " . $rowc['Tnamecount'];

$result = $DBO->query("SELECT Tname from tabelle1") ;
while ($row = $result->fetch()){
 if (strtoupper($row['Tname']) == "--------------------"){
  $foundtname = "yes";
 }
}
So würde es zwar gehen aber ich bräuchte 2 Select Abfragen.

2. Versuch, mit "fetchAll()" und dann das Array zählen geht ja so nicht.
while ($row = $result->fetchAll()){
 if (strtoupper($row[0]['Tname']) == "--------------------"){
  $foundtname = "yes";
 }
}

3. Möglichkeit.
$result = $DBO->query("SELECT Tname from tabelle1") ;
$i = 0;
while ($row = $result->fetch()){
 if (strtoupper($row['Tname']) == "--------------------"){
  $foundtname = "yes";
 }
$i++;
}

Wie würdet ihr das umsetzen?

vielen Dank und viele Grüße
hawk

  1. Hi,

    Ich möchte das gleiche nun mit PDO versuchen. Hier gibt es ja kein "mysql_num_rows".

    natürlich nicht. Es wäre etwas ... ungünstig, bei einer Abstraktion des DBMS ein bestimmtes DBMS zu referenzieren. Deswegen wird "mysql" wohl kaum vorkommen.

    1. Eine Möglichkeit wäre:

    Eine Möglichkeit wäre, in der Dokumentation zu PDO zu suchen und schnell mal rowCount zu finden. Siehe auch Zitat 231.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Yerf!

      Eine Möglichkeit wäre, in der Dokumentation zu PDO zu suchen und schnell mal rowCount zu finden. Siehe auch Zitat 231.

      Das ist bei SELECT aber nicht verlässlich (laut Doku abhängig vom verwendetetn Datenbanksystem... steht aber nicht dabei ob das mit MySQL geht, also wieder Probieren angesagt...)

      @@OP:

      Möglichkeit 1 ist doch schon mal nicht schlecht. Jetzt benutzt du in der 2. Query nur noch ein sinnvolles WHERE und wirfst die komische Schleife raus und die Sache passt.

      Gruß,

      Harlequin

      --
      <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
      1. Hallo Harlequin,
        danke dir für deine Hilfe.

        Möglichkeit 1 ist doch schon mal nicht schlecht. Jetzt benutzt du in der 2. Query nur noch ein sinnvolles WHERE und wirfst die komische Schleife raus und die Sache passt.>>

        Du meinst anstatt:
        $result = $DBO->query("SELECT Tname from tabelle1") ;
        while ($row = $result->fetch()){
         if (strtoupper($row['Tname']) == "--------------------"){
          $foundtname = "yes";
         }
        }

        Das so machen?
        $result = $DBO->query("SELECT Tname from tabelle1 WHERE Tname == '--------------------' ") ;
        $row = $result->fetch();
        if ($row['Tname'] != ""){
          $foundtname = "yes";
         }

        vielen Dank und viele Grüße
        hawk

        1. Yerf!

          Das so machen?
          $result = $DBO->query("SELECT Tname from tabelle1 WHERE Tname == '--------------------' ") ;
          $row = $result->fetch();
          if ($row['Tname'] != ""){
            $foundtname = "yes";
          }

          Im Prinzip... man könnte auch count(*) holen und schauen, obs größer 0 ist.

          Im Gegensatz zu deiner mysql()-Lösung die erst mal alle Datensätze holt und dann mit einer Schleife durchläuft dürfte die Lösung mit einer 2. Query auch um einiges schneller sein.

          Gruß,

          Harlequin

          --
          <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
    2. echo $begrüßung;

      Eine Möglichkeit wäre, in der Dokumentation zu PDO zu suchen und schnell mal rowCount zu finden.

      Dürfte ich dich bitten, die vorgeschlagene Handbuchseite selbst einmal zu lesen?

      echo "$verabschiedung $name";

  2. echo $begrüßung;

    1. Versuch, mit "fetchAll()" und dann das Array zählen geht ja so nicht.
      while ($row = $result->fetchAll()){

    Ein fetchAll() liefert keine einzelnen Zeilen. Es liefert ein komplettes Array der gesamten Ergebnismenge. Das in ein while einzubauen ist nicht sehr sinnvoll.
    Was für ein Problem hast du eigentlich bei diesem Versuch?

    echo "$verabschiedung $name";

    1. Hallo dedlfic,
      danke dir für deine Hilfe.

      Was für ein Problem hast du eigentlich bei diesem Versuch?

      Problem eigentlich nicht. Wie du schon sagtest. Man müsste wohl die "while" Schleife weglassen und mit "foreach" das Array durchlaufen.
      Es klappt ja so nicht mit "count($row)" innerhalb einer Schleife.

      Mir ging es halt nur darum wie ich den relativ kurzen Code mit mysql() auch in PDO hinbekomme.
      -----------
      $result = mysql_query("Select Tname from tabelle1") or mysql_error();
      $anzahltab1 = mysql_num_rows($result);
      while ($row = mysql_fetch_array($result)){
       if (strtoupper($row['Tname']) == "--------------------"){
        $foundtname = "yes";
       }
      }
      ----------------

      if( ($anzahltab1 == "") OR ($foundtname != "yes")  ){
      ....

      Das schöne hier ist halt das ich auf auf den $result einmal "mysql_num_rows" anwenden kann und den "mysql_fetch_array".

      Hättest du für das ganze eine elegantere Lösung?

      vielen Dank und viele Grüße
      hawk

      1. echo $begrüßung;

        Mir ging es halt nur darum wie ich den relativ kurzen Code mit mysql() auch in PDO hinbekomme.

        $result = mysql_query("Select Tname from tabelle1") or mysql_error();
        $anzahltab1 = mysql_num_rows($result);
        while ($row = mysql_fetch_array($result)){

        Das schöne hier ist halt das ich auf auf den $result einmal "mysql_num_rows" anwenden kann und den "mysql_fetch_array".
        Hättest du für das ganze eine elegantere Lösung?

        Wie wäre es damit:

        try {
            $result = $pdo->query('select ...')->fetchAll();
          } catch (PDOException $ex) {
            $result = array();
            // ggf. weitere Reaktionen
          }
          $anzahltab1 = count($result);
          foreach ($result as $row) {

        if( ($anzahltab1 == "") OR ($foundtname != "yes")  ){

        Wenn du eine Zahl hast, vergleiche sie mit einer solchen, nicht mit einem Leerstring.
        Wenn du einen Ja/Nein-Wert brauchst, nimm lieber die booleschen Werte true und false. Die lassen sich einfacher verarbeiten als Strings.

        echo "$verabschiedung $name";

        1. Hallo dedlfix,

          klasse deine Lösung.
          Die Schreibweise mit ->fetchAll(9 war mir auch nicht bekannt.
          Da sieht man den Experten.

          Warum ist eigentlich noch die Zeile
          $result = array();
          im Catch Block?

          <<Wenn du einen Ja/Nein-Wert brauchst, nimm lieber die booleschen Werte true und false. Die lassen sich einfacher verarbeiten als Strings.>>

          Meinst du es so?
          Nicht so;

          $found = "yes";
          ..
          if($found != "yes"){
          ..

          sondern so;
          $found = true;
          ..
          if($found != true){
          ..

          Was haben die booleschen Werte für einen Vorteil?

          Danke nochmals für all deine Hilfe.

          Gruss
          hawk

          1. echo $begrüßung;

            Warum ist eigentlich noch die Zeile
            $result = array();
            im Catch Block?

            Wenn $result nur im try-Block gesetzt wird, gibt es Folgefehler, wenn darauf zugegriffen wird. Wenn eine Variable in einem "hinteren" Programteil verwendet wird, muss auch bei Verzweigungen des "vorderen" Teils sichergestellt sein, dass sie existiert und einen sinnvollen Wert enthält.

            Wenn du einen Ja/Nein-Wert brauchst, nimm lieber die booleschen Werte true und false. Die lassen sich einfacher verarbeiten als Strings.
            $found = true;
            ..
            if($found != true){

            if (!$found) reicht.

            Was haben die booleschen Werte für einen Vorteil?

            Die beiden Zustände 0 und 1 bzw. 0 und Nicht-0 können vom Programm direkt ausgewertet werden. Ein Stringvergleich ist aufwendiger, weil da nicht nur auf ja/nein getestet werden muss, sondern jedes Zeichen einzeln mit dem des anderen Strings verglichen werden muss.

            echo "$verabschiedung $name";