kostenloser Webspace werbefrei: lima-city


PDO: bestimmte Spalte mit bindColumn

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    things

    things hat kostenlosen Webspace.

    Hallo zusammen!

    Ich werkel gerade an einer Art Geldwechsel-Seite. Für ein Spiel soll die virtuelle Währung A auch in die Währung B umgewandelt werden können, falls man gerade mehr A oder B braucht. Insgesamt gibt es vier Währungen.

    Formular, Validierung und Umrechnung habe ich soweit durch. Nun möchte ich nur noch die Daten in der Datenbank aktualisieren. Um nicht zig mal einen SQL-Befehl zu schreiben (Währung A kann ja in B, C und D getauscht werden, B in A, C und D, etc.) habe ich die Spalte und den neuen Wert der "Von-Währung" und der "Bis-Währung" in Variabeln gespeichert.

    Ich kriege das "bindColumns" leider nicht gehandhabt. Mit dem folgenden SQL versuche ich ein Ergebnis zu erzielen, damit ich den Fehler finde, denn es passiert in dieser Form anscheinend gar nichts. Ich bekomme keine Ausgabe und keine Fehlermeldung...

    $id = $_SESSION['id'];
    $bar = "coins";
    $connection = new PDO("mysql:host=xxx; dbname=xxx",
    						"xxx", "xxx",
    						array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
    $checksql = "SELECT foo FROM t_person WHERE id_pers = ?";
    $prepstate = $connection->prepare($checksql);
    $prepstate->bindParam(1, $id, PDO::PARAM_INT);
    $prepstate->execute();
    $prepstate->bindColumn('foo', $bar);
    			
    $data = $prepstate->fetchObject();
    $connection = NULL;
    echo("<h3>Data:</h3>");
    print_r($data);


    Ich würde mich sehr freuen, wenn mir jemand sagen könnte, wo mein Fehler liegt. Irgendwie spuckt auch google nichts aus, das mich auf meinen Fehler bringen würde - trotz mehrstündiger Suche.

    Vielen Dank für eure Hilfe und jeden Hinweis. Ich mein, irgendwie muss das doch gehen, oder!?

    Grüße
    things
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. na das haben wir hier alle schön ignoriert bisher!
    things schrieb:
    ... Ich bekomme keine Ausgabe und keine Fehlermeldung...
    sei froh!! das liegt daran, dass du error_reporting nicht eingeschaltet hast. sonst stünde als fehlermeldung da so etwas wie:
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[28000] [1045] Access denied for user 'czibere'@'localhost' (using password: YES)' in /var/www/html/_forum/things/pdo-bestimmte-spalte-mit-bindcolumn.php:11 Stack trace: #0 /var/www/html/_forum/things/pdo-bestimmte-spalte-mit-bindcolumn.php(11): PDO->__construct('mysql:dbname=ca...', 'czibere', 'cziberepasswort') #1 {main} thrown in /var/www/html/_forum/things/pdo-bestimmte-spalte-mit-bindcolumn.php on line 11
    merkst das? da steht 'PDO->__construct('mysql:dbname=ca...', 'czibere', 'cziberepasswort')'. na dann gute nacht! wer das sieht, hat mein passwort (nicht - ätsch ;)!

    um das zu vermeiden, immer brav schreiben:
    try {
      $dbh = new PDO(
        'mysql:host=xxx;dbname=xxx',
        'username',
        'password'
      );
    
      // hier gehts weiter, wenn alles in ordnung ist...;
    
    } catch (PDOException $e) {
      // und da ist es natürlich mist!
      echo 'Connection failed: ' . $e->getMessage();
    }
    dass das binden nicht geht, kann ich nur raten. weil du kein (namens) 'foo' (was auch immer) hast?

    hier ist ein test von mir am localhost:
    try {
      $dbh = new PDO($dsn, $user, $password);
    
      $checksql = "SELECT * FROM sex";
      $prepstate = $dbh->prepare($checksql);
      $prepstate->bindParam(1, $id, PDO::PARAM_INT);
      $prepstate->execute();
      $prepstate->bindColumn('sex', $bar);
    
      $data = $prepstate->fetchObject();
      $dbh = NULL;
      echo("<h3>Data (\$bar['sex'] = $bar):</h3><pre>");
      print_r($data);
    
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
    mit dem ergebnis
    Data ($bar['sex'] = ♀):
    
    stdClass Object
    (
        [ID] => 1
        [sex] => ♀
        [description] => FEMALE SIGN: U+2640, e2 99 80, ♀
    )
    wie man sieht also, sexus ist weiblich. ein- bis zweiwandfrei ;) oder?
  4. Autor dieses Themas

    things

    things hat kostenlosen Webspace.

    Hi czibere,
    ja, ich hatte bisher nicht viel Glück mit meinen Fragen...
    Inzwischen hatte ich das Problem sogar erkannt: Ich war der Meinung, dass ich so variabel die auszulesenden Spalten in den Query einspeisen kann. Das ist aus Sicherheitsgründen nicht möglich. bindColum ist dafür da, nachdem der Query ausgeführt wurde, die Rückgabewerte der Spalten in Variabeln zu speichern. Für mich also nicht zu verwenden :)
    Meine Spalten stehen nun in den Variabeln $from und $to, die Wechselgeld-Werte in $offer und $change und mein Query geht nach endlosen Zeilen dann so:
    //only way to keep that query variable...
    $checksql = 'UPDATE t_person SET ' . $from . ' = ' . $from . ' - ?, ' . $to . ' = ' . $to . ' + ? WHERE id_pers = ?';
    $prepstate = $connection->prepare($checksql);
    $prepstate->bindParam(1, $offer, PDO::PARAM_INT);
    $prepstate->bindParam(2, $change, PDO::PARAM_INT);
    $prepstate->bindParam(3, $id, PDO::PARAM_INT);
    $prepstate->execute();
    $connection = NULL;

    Nicht schön, aber besonders ^^" Mein Query wird nun mit den Variabeln zusammengestückelt.

    Und bindColumn findet dann doch noch Anwendung in der Aktualisierung der Session:
    $checksql = 'SELECT ' . $from . ', ' . $to . ' FROM t_person WHERE id_pers = ?';
    $prepstate = $connection->prepare($checksql);
    $prepstate->bindParam(1, $_SESSION['id'], PDO::PARAM_INT);
    $prepstate->execute();
    //bindColumn = set value of column to variable
    $prepstate->bindColumn($from, $_SESSION[$from]);
    $prepstate->bindColumn($to, $_SESSION[$to]);
    $prepstate->fetchObject();	//also need to set column to variable
    $connection = NULL;


    Mit der Verbindung ist ein wertvoller Hinweis - vielen Dank! Ich muss mal schauen, wie ich das formschön umsetze, da die Verbindungsdaten in einer include-Datei liegen...

    Vielen Dank nochmal für die Rückmeldung :)

    Grüße
    things
  5. things schrieb:
    ... Nicht schön, aber besonders ^^" Mein Query wird nun mit den Variabeln zusammengestückelt ...
    no dann mache es schöner;) auch bei sql gibt es formatierungskonventionen:
    $checksql = <<< EOT
    UPDATE t_person
      SET `from`=$from-?, `to`=$to+?
      WHERE id_pers=?
    EOT;
    
    $checksql = <<< EOT
    SELECT $from, $to
      FROM t_person
      WHERE id_pers=?
    EOT;
    wobei ich denke mal die je ersten from und to spaltennamen sind. gleich aber auch reservierte wörter in mysql, daher in backticks. (die fragezeichen sind wahrscheinlich klar für dich. ich muss es nicht verstehen ;)
    wenn '<<< EOT' unklar ist, dann einfach nachlesen.

    Beitrag zuletzt geändert: 10.1.2014 3:25:03 von czibere
  6. Autor dieses Themas

    things

    things hat kostenlosen Webspace.

    Danke für deine Hilfe, czibere!
    Warum ich nun aber Heredoc verwenden soll, ist mir nicht klar. Damit ist mein Problem doch wieder da!

    Wie gesagt liegen in $from und $to die Spaltennamen (z. B. "coins") von den Währungen (von 4 möglichen Währungen), die eingewechselt werden. Ich weiß nicht, welche es sind und da die Kombinationen vielfältig sind (A zu B, A zu C, D zu A, B zu D, C zu B, ...), möchte ich einen Query nutzen. Um nicht in jeder Abfrage, wo ich schon $from und $to setze, das UPDATE-Statement zu schreiben, brauche ich diese Variablen.

    Und dann schreibe ich doch auch wieder
    $checksql = <<< EOT
    UPDATE t_person
      SET $from=$from-?, $to=$to+?
      WHERE id_pers=?
    EOT;

    Gut, vielleicht ein kleines bisschen besser lesbar...

    Inwieweit gerate ich denn mit den Konventionen in Konflikt?

    Danke für deine Mühe!

    Grüße
    things
  7. things schrieb:
    ... Damit ist mein Problem doch wieder da! ...
    du meinst noch immer ;)
    ok! ich habe das ding gleich ein paar mal im kopf rumspuken lassen (deine beschreibung ist so ungewöhnlich wie dein sql-beispiel)

    wenn ich jetzt dein prob richtig interpretiere, du kanns dafür 'variable variablen' nehmen und das sieht dann so aus (nur beispiel klar!):
    <?php
    // variablen initialisieren:
    $from  = 'from_money';
    $$from = 15.30;
    $to    = 'to_money';
    $$to   = 115.40;
    
    // query bauen:
    $query = <<<EOT
    UPDATE t_person
      SET `$from`={$$from}, `$to`={$$to}
      WHERE id_pers=?
    EOT;
    
    // ist nur testausgabe:
    echo '<pre>'.$query;
    die ausgabe in diesem testall sieht so aus:
    UPDATE t_person
      SET `from_money`=15.30, `to_money`=115.40
      WHERE id_pers=?

    (no! mal sehen ;)

    ==== EDIT ====
    konvention, heredoc ... blaaa ... all das kann einen helfen, oder auch nicht ;). ein beispiel: die selbe sql abfrage einmal formatiert, einmal in einer wurst - allerdings beide mit dem selben fehler (nur für lehrzwecke ;)
    mysql> SELECT c.name, t.name, t.description
        ->   FROM  help_category c,
        ->         help_topic t
        ->   WHERE c.help_category_id=4 AND
        ->         c.help_category_id=t.help_ca~tegory_id
        ->   LIMIT 2;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '~tegory_id
      LIMIT 2' at line 5
    
    mysql> SELECT c.name, t.name, t.description FROM  help_category c, help_topic t WHERE c.help_category_id=4 AND c.help_category_id=t.help_ca~tegory_id LIMIT 2;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '~tegory_id LIMIT 2' at line 1
    bei der formatierten query finde ich doch erheblich leichter die ehlerstelle! oder?

    heredoc - steht glaube ich zwar nicht so unter php.net, aber ich würde es behaupten, damit kannst du 'vorformatierte texte' (html, sql-query, ...) einfacher schneller und übersichtlicher eine variable zuweisen. (das ist meine theory ;)

    Beitrag zuletzt geändert: 28.1.2014 15:04:43 von czibere
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!