You are not logged in.

  • "Felix (Keyway)" is male
  • "Felix (Keyway)" started this thread

Posts: 191

Location: Hamburg

Occupation: Keinen da in der schulischen Ausbildung

  • Send private message

1

Sunday, June 17th 2012, 6:46pm

PDOStatement::bindParam() streikt

Ich habe mich mal an PDO drangewagt und ein simples Script zum Testen erstellt:

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html>
    <head>
        <title>Datenbanken mit PDO</title>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <section>
            <h1>Zeige Datensätze</h1>
<?php
$pdo = new PDO('mysql:host=localhost;dbname=mysql''root''stern2');
$sth $pdo->prepare('SELECT * FROM db');
$sth->execute();
$result $sth->fetchAll();
foreach ($result as $name => $wert) :
    $name++;
    echo "                <section>\n";
    echo "                    <h2>" $name ":</h2>\n";
    echo "                    <p>\n";
    foreach ($result[$name-1] as $name => $wert) :
        echo "                        " $name ': ' $wert "<br />\n";
    endforeach;
    echo "                    </p>\n";
    echo "                </section>\n";
endforeach;
?>
        </section>
    </body>
</html>


Das funktioniert auch. Aber sobald bindParam dazugenommen wird, wird nichts angezeigt, d.h. es werden keine Datensätze ausgelesen und verschachtelten foreach()-Schleifen ausgeführt.

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html>
    <head>
        <title>Datenbanken mit PDO</title>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <section>
            <h1>Zeige Datensätze</h1>
<?php
$table 'db';
$pdo = new PDO('mysql:host=localhost;dbname=mysql''root''stern2');
$sth $pdo->prepare('SELECT * FROM table');
$sth->bindParam('table'$tablePDO::PARAM_STR12);
$sth->execute();
$result $sth->fetchAll();
foreach ($result as $name => $wert) :
    $name++;
    echo "                <section>\n";
    echo "                    <h2>" $name ":</h2>\n";
    echo "                    <p>\n";
    foreach ($result[$name-1] as $name => $wert) :
        echo "                        " $name ': ' $wert "<br />\n";
    endforeach;
    echo "                    </p>\n";
    echo "                </section>\n";
endforeach;
?>
        </section>
    </body>
</html>


Wüsste da jemand bescheid? Bei der dritten Variante gibt es sogar einen Fatal Error.

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html>
    <head>
        <title>Datenbanken mit PDO</title>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <section>
            <h1>Zeige Datensätze</h1>
<?php
$pdo = new PDO('mysql:host=localhost;dbname=mysql''root''stern2');
$sth $pdo->prepare('SELECT * FROM ?');
$sth->bindParam(1'db'PDO::PARAM_STR12);
$sth->execute();
$result $sth->fetchAll();
foreach ($result as $name => $wert) :
    $name++;
    echo "                <section>\n";
    echo "                    <h2>" $name ":</h2>\n";
    echo "                    <p>\n";
    foreach ($result[$name-1] as $name => $wert) :
        echo "                        " $name ': ' $wert "<br />\n";
    endforeach;
    echo "                    </p>\n";
    echo "                </section>\n";
endforeach;
?>
        </section>
    </body>
</html>


Quoted

Fatal error: Cannot pass parameter 2 by reference in E:\server\var\www\keyway-xelonis\com\htdocs\test\pdo.php on line 13


Dabei, habe ich alles so gemacht, wie im PHP-Handbuch beschrieben. PHP-Version: 5.4.4. Vielen Dank im Vorraus für hilfreiche Antworten ;) .
Mit freundlichen Grüßen
Best Regards
Felix

This post has been edited 2 times, last edit by "Felix (Keyway)" (Jun 20th 2012, 9:06pm)


Alexander Ebert

WoltLab Developer

  • "Alexander Ebert" is male

Posts: 4,736

Location: Berlin

  • Send private message

2

Sunday, June 17th 2012, 7:36pm

Du kannst nur Variablen als zweiten Parameter für bindParam() übergeben, das steht im übrigen auch in der Dokumentation.
Alexander Ebert
Developer WoltLab® GmbH


  • "Felix (Keyway)" is male
  • "Felix (Keyway)" started this thread

Posts: 191

Location: Hamburg

Occupation: Keinen da in der schulischen Ausbildung

  • Send private message

3

Sunday, June 17th 2012, 7:43pm

Du kannst nur Variablen als zweiten Parameter für bindParam() übergeben, das steht im übrigen auch in der Dokumentation.


Ah, danke Alexander ;) . Aber ich frage mich, warum, wenn bindParam() verwendet wird, nichts zurückgeliefert wird.

Das ist das Ergebnis, wenn bindParam() wie im zweiten Beispiel verwendet wird:

HTML

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
	<head>
		<title>Datenbanken mit PDO</title>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	</head>
	<body>
		<section>
			<h1>Zeige Datensätze</h1>
		</section>
	</body>
</html>


Die Schleife und PDO werden aus irgendeinem Grund nicht ausgeführt, nur, dass was nicht durch <?php ?> maskiert ist.
Mit freundlichen Grüßen
Best Regards
Felix

Alexander Ebert

WoltLab Developer

  • "Alexander Ebert" is male

Posts: 4,736

Location: Berlin

  • Send private message

4

Sunday, June 17th 2012, 8:08pm

Wenn die Abfrage keine Ergebnisse hat, so gibt es auch keinen Schleifendurchlauf. Im übrigen sollte man Tabellennamen nicht als Platzhalter übergeben, die Platzhalter sind für tatsächliche Werte gedacht:

MySQL queries

1
2
3
SELECT	username
FROM	wcf1_user
WHERE	userID = ?
Alexander Ebert
Developer WoltLab® GmbH


  • "Felix (Keyway)" is male
  • "Felix (Keyway)" started this thread

Posts: 191

Location: Hamburg

Occupation: Keinen da in der schulischen Ausbildung

  • Send private message

5

Sunday, June 17th 2012, 8:11pm

Ah, ich sollte statt execute() lieber query() verwenden, oder?

Und noch eine zweite Frage: Kann ich bindParam() auch im Zusammenhang mit query verwenden?
Mit freundlichen Grüßen
Best Regards
Felix

This post has been edited 1 times, last edit by "Felix (Keyway)" (Jun 17th 2012, 8:27pm)