• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

MySQL mit PHP Zeichensatzproblem

Fang bitte damit an, dass du die Syntax richtig verwendest:
PHP:
$res = mysql_db_query($Datenbank, "select * from ".$Tabelle);
Lass also bitte die Doublequotes um die Variablen weg.
Wie schon gesagt, das ist nicht falsch.
Was wirklich schlimm ist, dass du noch immer die Funktion mysql_db_query() benutzt.
 
Hallo,
das mit dem i war ein Fehler, weil ich aus versehen nicht den ganzen Code gepostet hatte, es handelt sich um zwei ineinander verschachtelte Schleifen:

PHP:
$db = mysql_connect();
$res = mysql_db_query("$Datenbank", "select * from $Tabelle");
$num = mysql_num_rows($res);
$cl = mysql_db_query("$Datenbank", "show columns from $Tabelle");
$numcl = mysql_num_rows($cl);
for ($l=0; $l<$numcl; $l++){
$Spalte = mysql_result($cl, $l, "Field");
print $Spalte;
}
for ($i=0; $i<$num; $i++){
	for ($l=0; $l<$numcl; $l++){
		$Spalte = mysql_result($cl, $l, "Field");
		$txt = mysql_result($res, $i, $Spalte);
		print $txt;
	}
}

Hier der Fehler:
Warning: mysql_result() [function.mysql-result]: [Spaltenname mit Sondrzeichen (ohne ' angezeigt und eingegeben)] not found in MySQL result index 7 in C:\Programme\Apache Software Foundation\Apache2.2\htdocs\edvusc\Aktion.php on line 201



Warum soll ich mysql_db_query() nicht verwenden, ist das veraltet?
 
Zuletzt bearbeitet:
Lerne bitte, richtig zu debuggen beziehungsweise sinnvolle Ausgaben zu deinem Problem mitzuliefern. Deine Fehlerbeschreibungen in diesem Thread waren bisher leider fast völlig unbrauchbar.

- Tipps dazu etwa hier: Debuggen - PHP Forum: phpforum.de

Interessant sind immer die Eingaben, die erwarteten Ausgaben und die tatsächlichen Ausgaben.
 
Hallo,
ich habe mal folgenden Testcode geschrieben:

PHP:
<html>
<body>
<script language="php" >
$db = mysql_connect();
$res = mysql_db_query("Testdatenbank", "select * from testtabelle");
$num = mysql_num_rows($res);
$cl = mysql_db_query("Testdatenbank", "show columns from testtabelle");
$numcl = mysql_num_rows($cl);
print "<table border=1 >";
print "<tr>";
for ($l=0; $l<$numcl; $l++){
	$Spalte = mysql_result($cl, $l, "Field");
	print "<th>$Spalte</th>";
}
print "</tr>";
for ($i=0; $i<$num; $i++)
{
	print "<tr>";
	for ($l=0; $l<$numcl; $l++){
		$Spalte = mysql_result($cl, $l, "Field");
		$txt = mysql_result($res, $i, "$Spalte");
		print "<td>$txt</td>";
	}
	print "</tr>";
}
print "</table>";
mysql_close($db);
</script>
</body>
</html>

(mysql_db_query() ändere ich später noch)

Dabei werden die DAten aus Spalte drei (Name: SP.3) nicht ausgegeben, es kommt nur:


Warning: mysql_result() [function.mysql-result]: SP.3 not found in MySQL result index 3 in C:\Programme\Apache Software Foundation\Apache2.2\htdocs\Test.php on line 21

Warning: mysql_result() [function.mysql-result]: SP.3 not found in MySQL result index 3 in C:\Programme\Apache Software Foundation\Apache2.2\htdocs\Test.php on line 21
SP 1 SP-2 SP.3
Z1 Z2
Z2.1 Z2.2

Zeile 21 ist die, wo $txt =... steht.

Bei Spalte 3 fehlen also die Werte.
Das kommt immer dann, wenn im Spaltenname ein Punkt ist.
Die abfrage des Spaltennamens geht ja (siehe Tabellenüberschrift), wenn ich diesen Namen aber wieder in eine Abfrage setze, ergibt er einen Fehler.
Da ist wohl wieder ein Konvertierungsproblem, wodurch entsteht dieses?
 
Du dürftest in der inneren Schleife bereits alle Einträge aus $cl abgeholt haben.

PHP:
<?php

function escapeIdentifier($name)
{
    $name = str_replace('`', '``', $name);
    $name = trim($name);
    $name = '`' . $name . '`';

    return $name;
}

function printTable($tblname, $con)
{
    $result = mysql_query("SELECT * FROM " . escapeIdentifier($tblname) . "
                           ORDER BY `id` ASC", $con);

    echo '<table border="1">';
    $first = true;
    while ($row = mysql_fetch_assoc($result)) {
        if ($first) {
            // Spaltennamen ausgeben
            echo '<tr><th>'
                . implode('</th><th>', array_keys($row))
                . '</th></tr>';
            $first = false;
        }

        echo '<tr><td>' . implode('</td><td>', $row) . '</td></tr>';
    }
    echo '</table>';
}

error_reporting(-1);

$host     = 'localhost';
$username = '';
$password = '';
$dbname   = 'tests';
$tblname  = 'foo';

$con = mysql_connect($host, $username, $password);
mysql_select_db($dbname, $con);

printTable($tblname, $con);
 
Formuliere ich es eben um.

Was steht in $Tabelle wenn du dein query absetzt. Was in $Datenbank.
Und Nein, falsch ist es nicht, könnte aber zu Fehleren führen. Daher 100% korrekte Syntax oder $Tabelle korrekt belegen.
Nicht umsonst wird z.B. zwischen Double und Single-Quotes unterschieden.
 
Hallo,

ich verstehe nicht, was am Beispielcode, außer mysql_db_query (), falsch ist.
In der äußeren Schleife durchlaufe ich alle Zeilen.
In der inneren Schleife durchlaufe ich jede Spalte und gebe den Wert, der in der durchlaufenen Spalte in der in der äußeren Schleife durchlaufenen Zeile steht, aus.
Bis auf Fälle, wo im Spaltenname ein Punkt steht funktioniert es auch.

Ich habe mir die Tabelle mal in der MySQL-Konsole angesehen, da funktioniert der Spaltenname mit Punkt.
Der Punkt muss irgendwie escaped werden.
Das habe ich bemerkt, als ich aus Versehen einen falschen Tabellennamen angegeben habe und als Fehler zurückkam, dass 'Testdatenbank.Testtabell' nicht gefunden wurde.

Der Punkt wird also als Seperator verwendet und muss wahrscheinlich daher irgendwie escaped werden, oder?
 
Ja, deshalb habe ich die entsprechende Funktion in meine Antwort integriert. An dem Punkt waren wir doch eigentlich schon. ;)

mermshaus schrieb:
Du dürftest in der inneren Schleife bereits alle Einträge aus $cl abgeholt haben.

Das scheint hier doch zu klappen, denn mysql_result entfernt keine Einträge aus dem ResultSet, was auch irgendwie logisch ist. Die mysql_fetch*-Methoden holen die einzelnen Zeilen aber ab.
 
Hallo mermshaus,

Wenn der Name in ' ... ' gesetzt wird, ist der Punkt also darin egal?
Wenn ja, dann habe ich es verstanden und müsste es jetzt eigentlich hinbekommen.

Vielen Dank!
 
Wenn der Name in Anführungszeichen gesetzt wird, definiert das einen String und du bekommst eine Fehlermeldung, weil ein Identifier erwartet wird. Die stehen in SQL in Backticks `…`.

Die passende Funktion zum Escapen von Tabellennamen, also Identifiern, habe ich inzwischen glaube ich zweimal erklärt und dreimal gepostet. In Post #10 ist im Prinzip alles erschöpfend beantwortet.

Nimm es mir nicht übel, aber ich bekomme mehr und mehr das Gefühl, dass du höchstens mal die ersten drei Sätze einer Antwort liest und überhaupt nicht versuchst, den Inhalt nachzuvollziehen. Ich weiß, der Thread ist etwas chaotisch verlaufen, aber dennoch. Etwas mehr Engangement wäre gut.
 

Neueste Beiträge

Zurück
Oben