1 Zeichen löschen und dann 1 Var. aus 3 Feldern zusammenstellen

1 Zeichen löschen und dann 1 Var. aus 3 Feldern zusammenstellen

am 04.11.2004 00:00:15 von j_wenke

Hallo,
leider bin ich bisher bzgl. eines "Zeichenlöschers"
nicht fündig geworden - bei den String-Funktionen.
Zeichen könnte ich zwar austauschen, aber nicht löschen.

Ich habe drei Felder, aus denen eine Variable (Dateiname) gebaut
werden soll:
2003-06-07 j 5
date char(1) tinyint(2)
ergeben soll das
0306j05.gif

Mit

$query2 = SELECT date, SUBSTRING(date,3,5) AS kurzdat FROM test;

habe ich das Datum bis auf 03-06 gekürzt, hier in eine Art
virtuelles Feld "kurzdat".
Das klappt aber nur in PhpAdmin und MySQL-DOS-Fenster,
ansonsten ergibt es in der Zeile ein "unexpected T_STRING"-Error.??
Hier hakt es also auch :-(

und mit

$result = mysql_query($query, $link);
while ($erg = mysql_fetch_array($result))
$fname = implode($erg, "");
printf("%s", $fname);

bekomme ich einen Datensatz doppelt ausgegeben??
- jeder Feldinhalt wird doppelt aufgeführt?
(eine Abfrage-Schleife käme dann später noch ...)

Hat jemand Tipps, wie man das am geschicktesten lösen kann??
Vielen Dank! Gruß, Jörg

php 4.2.1, apache 1.3

Re: 1 Zeichen löschen und dann 1 Var. aus 3 Feldern zusammenstellen

am 04.11.2004 00:32:44 von Stephan Mann

On 2004-11-04 00:00:15, j wenke wrote:
> Ich habe drei Felder, aus denen eine Variable (Dateiname) gebaut
> werden soll:
> 2003-06-07 j 5
> date char(1) tinyint(2)
> ergeben soll das
> 0306j05.gif

Du suchst die MySQL-Funktion DATE_FORMAT(). Alternativ sollten auch DAY()
und MONTH() zum Ziel fuehren.

http://dev.mysql.com/doc/mysql/en/Date_and_time_functions.ht ml

hth, stephan
--
Der Terrorismus ist ein Krieg der Armen gegen die Reichen.
Der Krieg ist ein Terrorismus der Reichen gegen die Armen.
[Sir Peter Ustinov, 1921 - 2004]

Re: 1 Zeichen löschen und dann 1 Var. aus 3 Feldern zusammenstellen

am 04.11.2004 00:55:00 von Michael Fesser

.oO(j wenke)

>leider bin ich bisher bzgl. eines "Zeichenlöschers"
>nicht fündig geworden - bei den String-Funktionen.
>Zeichen könnte ich zwar austauschen, aber nicht löschen.
>
>Ich habe drei Felder, aus denen eine Variable (Dateiname) gebaut
>werden soll:
>2003-06-07 j 5
> date char(1) tinyint(2)
>ergeben soll das
>0306j05.gif

Sollte nicht allzu schwer sein.

* Mit CONCAT() kannst Du Strings zusammenfügen.
* Das Datum kannst Du mit DATE_FORMAT() zerlegen wie Du es haben willst.
* Der Integer, so er denn zweistellig sein soll ... hmm. Zur Not auf die
harte Tour mit IF() und LENGTH(), vielleicht auch mit LPAD() und
CAST(). Geht aber eventuell auch eleganter (hab sowas bisher noch
nicht gebraucht).

Das Ganze sähe dann etwa so aus:

SELECT
CONCAT(
DATE_FORMAT(date, '%y%m'),
dasCharFeld,
LPAD(CAST(dasIntFeld AS CHAR), 2, '0')
) AS filename,
...
FROM ...

>Das klappt aber nur in PhpAdmin und MySQL-DOS-Fenster,
>ansonsten ergibt es in der Zeile ein "unexpected T_STRING"-Error.??

PHP-Fehler. Die Query ist korrekt, sonst würde bereits MySQL einen
Fehler ausspucken.

Micha

Re: 1 Zeichen löschen und dann 1 Var. aus 3 Feldern zusammenstellen

am 04.11.2004 01:48:15 von Niels Braczek

j wenke schrieb:
^^^^^^^
Gib hier bitte deinen ganzen Namen an.

> $query2 = SELECT date, SUBSTRING(date,3,5) AS kurzdat FROM test;
>
> habe ich das Datum bis auf 03-06 gekürzt, hier in eine Art
> virtuelles Feld "kurzdat".
> Das klappt aber nur in PhpAdmin und MySQL-DOS-Fenster,
> ansonsten ergibt es in der Zeile ein "unexpected T_STRING"-Error.??

Es fehlen die Stringbegrenzer.
$query2 = "SELECT date, SUBSTRING(date,3,5) AS kurzdat FROM test";

> $result = mysql_query($query, $link);
> while ($erg = mysql_fetch_array($result))
> $fname = implode($erg, "");
> printf("%s", $fname);

Hier fehlen die Block-Klammern; daher wird nur das erste Statement nach
while() innerhalb der Schleife ausgeführt. Ausgegeben wird nur der
letzte Datensatz.

$result = mysql_query($query, $link);
while ($erg = mysql_fetch_array($result)) {
$fname = implode($erg, "");
echo $fname;
}

> bekomme ich einen Datensatz doppelt ausgegeben??
> - jeder Feldinhalt wird doppelt aufgeführt?
> (eine Abfrage-Schleife käme dann später noch ...)

Die zweite Ausgabe kommt wohl von der zweiten Schleife, die sicherlich
denselben Fehler enthält und daher nur den letzten Datensatz ausgibt.

MfG
Niels

--
Mir fehlen die Kenntnisse, um überhaupt eine Vorstellung davon zu
haben, wo ich ansetzen kann den Fehler zu suchen. Einen
Programmierfehler kann ich aber ausschließen.
[Florian Steyer in dclpi]

Re: 1 Zeichen löschen und dann 1 Var. aus 3 Feldern zusammenstellen

am 08.11.2004 03:14:06 von j_wenke

Hallo,

vielen Dank für eure Hilfen!

Mit:

SELECT CONCAT(DATE_FORMAT(date,'%y%m'), dasCharFeld,
LPAD('(CAST(dasIntFeld AS CHAR))', 5, '0')) AS fname FROM test

bekomme ich in einem Feld fname aber leider nur zu sehen
9910a(Cast

(in MySQL-Front)


oder / bzw. mit

$query = "SELECT date, dasCharFeld, dasIntFeld FROM test WHERE
dasIntFeld > 0";
$result = mysql_query($query, $link);
$zeilen = mysql_num_rows($result);
printf("Es gibt %d Ergebnisse.\n

", $zeilen); // gibt 193 Ergebnisse
$f = "SELECT CONCAT(DATE_FORMAT(date,'%y%m'), dasCharFeld,
LPAD('(CAST(dasIntFeld AS CHAR))', 2, '0')) AS fname FROM test";
$query_result = mysql_query ($f) or die (mysql_error());
$name = $f['fname'];
echo $name . "
";
echo "
";

bekomme ich leider nur ein "S" zu sehen??

(in PHP-Coder)


ich habe schon hin und her probiert ... |-|
und gelesen ...

dasIntFeld hat teilweise auch die Werte 00 (Negativ-Nummer)
Ich las mal, dass die Null bei Char Probleme geben könnte?

GRüße, Jörg

Re: 1 Zeichen löschen und dann 1 Var. aus 3 Feldern zusammenstellen

am 08.11.2004 03:43:02 von Niels Braczek

j wenke schrieb:

> SELECT CONCAT(DATE_FORMAT(date,'%y%m'), dasCharFeld,
> LPAD('(CAST(dasIntFeld AS CHAR))', 5, '0')) AS fname FROM test
^ ^

> bekomme ich in einem Feld fname aber leider nur zu sehen
> 9910a(Cast

Das ist auch logisch, weil du nicht die Funktion CAST() aufrufst,
sondern einen String 'CAST(...)' angibst. Diese Stringbegrenzer sind
fehl am Platze.

> oder / bzw. mit
>
> $query = "SELECT date, dasCharFeld, dasIntFeld FROM test WHERE
> dasIntFeld > 0";
> $result = mysql_query($query, $link);
> $zeilen = mysql_num_rows($result);
> printf("Es gibt %d Ergebnisse.\n

", $zeilen); // gibt 193
> Ergebnisse $f = "SELECT CONCAT(DATE_FORMAT(date,'%y%m'), dasCharFeld,
> LPAD('(CAST(dasIntFeld AS CHAR))', 2, '0')) AS fname FROM test";
> $query_result = mysql_query ($f) or die (mysql_error());
> $name = $f['fname'];
> echo $name . "
";
> echo "
";
>
> bekomme ich leider nur ein "S" zu sehen??

Weil in $f 'SELECT ...' steht unf 'fname' zu 0 evaluert.
Lies bitte
17.2. Wie greife ich auf eine MySQL-Datenbank zu?
http://www.php-faq.de/q/q-mysql-zugriff.html
(und verwende dann mysql_fetch_assoc() statt mysql_fetch_array()).

Setze zusätzlich

error_reporting(E_ALL);

an den Anfang deiner Skripte.

MfG
Niels

--
Microsoft is not the answer - Microsoft is the question.
The answer is NO! [Anonym]

Re: Var. aus 3 Feldern zusammenstellen

am 09.11.2004 11:22:36 von j_wenke

Hallo
und vielen Dank bis hier.
>>...
>>bekomme ich leider nur ein "S" zu sehen??
>
> Weil in $f 'SELECT ...' steht unf 'fname' zu 0 evaluert.
Sorry. Ich bin kein Profi. Damit konnte ich nichts anfangen.

Ich "hänge" leider noch etwas. Nach MySQL Manual
etc.) ist m.E. eigentlich alles richtig.


SELECT CONCAT(DATE_FORMAT(date,'%y%m'), Feld1Char, LPAD((CAST(Feld2Int
AS CHAR)), 2, '0')) AS Feld3Alias FROM testDB";

ergibt in MySQL-Front
Fehler in der Syntax bei 'Feld2Int AS CHAR)), 2, '0')) AS Feld3Alias
FROM testDB"'

>>>> wo liegt denn da der Fehler?
CAST(expr AS type) bzw.
CAST(character_string AS character_data_type CHARACTER SET charset_name)
Example: SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);


und als

....
$f = "SELECT CONCAT(DATE_FORMAT(date,'%y%m'), Feld1Char,
LPAD((CAST(Feld2Int AS CHAR)), 2, '0')) AS Feld3Alias FROM test";

while ($f = mysql_fetch_assoc($result)) {
echo $f["Feld3Alias"];
echo "
";
}
....

ergibt im Browser (PHP-Coder)
Notice: Undefined index: Feld3Alias

>>>> muß das indiziert werden? und wie ginge das mit einem Alias??


und anstatt While ... echo

....
printf("%s
", $f["Feld3Alias"]);
....
ergibt (nachwievor(neben: mit DB verbunden. Es gibt 193 Ergebnisse))
ein "schnödes"

S


>>>> Kann mir vielleicht noch jemand ein wenig weiter helfen?

Vielen Dank,
Gruß, Jörg

Re: Var. aus 3 Feldern zusammenstellen

am 09.11.2004 15:22:34 von Niels Braczek

j wenke schrieb:

> >>...
> >>bekomme ich leider nur ein "S" zu sehen??
> >
> > Weil in $f 'SELECT ...' steht unf 'fname' zu 0 evaluert.

> Sorry. Ich bin kein Profi. Damit konnte ich nichts anfangen.

Mit $f['fname'] willst du den Eintrag 'fname' des Arrays $f auslesen,
der aber nicht existiert, weil $f ein String ist. $f enthält deinen
SQL-String, der mit 'SELECT' beginnt.
Aus historischen Gründen erlaubt PHP den falschen Zugriff auf einzelne
Zeichen eines Strings mittels Array-Syntax.
'fname' ist ein String, der bei Verwendung als Integerwert wie eine 0
gewertet wird. Mit $f['fname'] greifst du hier also auf das Zeichen mit
dem Index 0 im String 'SELECT ...' zu, also auf das 'S'.

> Ich "hänge" leider noch etwas. Nach MySQL Manual
> etc.) ist m.E. eigentlich alles richtig.

Nein, du irrst.

> SELECT CONCAT(DATE_FORMAT(date,'%y%m'), Feld1Char, LPAD((CAST(Feld2Int
> AS CHAR)), 2, '0')) AS Feld3Alias FROM testDB";
>
> ergibt in MySQL-Front
> Fehler in der Syntax bei 'Feld2Int AS CHAR)), 2, '0')) AS Feld3Alias
> FROM testDB"'

,---[http://dev.mysql.com/doc/mysql/en/Cast_Functions.html]
| CAST() and CONVERT() are available as of MySQL 4.0.2.
`---

SELECT CONCAT(DATE_FORMAT(date,'%y%m'),
Feld1Char,
LPAD(Feld2Int, 2, '0')
) AS Feld3Alias
FROM gruppen

funktioniert prima. Siehe MySQL-Manual zu CAST():

,---[http://dev.mysql.com/doc/mysql/en/Cast_Functions.html]
| If you use a number in string context, the number
| automatically is converted to a BINARY string.
`---

> ...
> $f = "SELECT CONCAT(DATE_FORMAT(date,'%y%m'), Feld1Char,
> LPAD((CAST(Feld2Int AS CHAR)), 2, '0')) AS Feld3Alias FROM test";
>
> while ($f = mysql_fetch_assoc($result)) {
> echo $f["Feld3Alias"];
> echo "
";
> }
> ...
>
> ergibt im Browser (PHP-Coder)
> Notice: Undefined index: Feld3Alias

Da fehlt die Ausführung der Abfrage.
Außerdem ist die Wahl deiner Variablennamen ungünstig. Namen von
Variablen dienen der Dokumentation, daher sollten sie selbsterklärend
sein.

$sqlStr = "SELECT CONCAT(DATE_FORMAT(date,'%y%m'),
Feld1Char,
LPAD(Feld2Int, 2, '0')
) AS Feld3Alias
FROM gruppen";

$result = mysql_query($sqlStr)
or die($sqlStr.'
'.mysql_error());

while ($row = mysql_fetch_assoc($result)) {
echo $row['Feld3Alias'], '
';
}

> printf("%s
", $f["Feld3Alias"]);
> ...
> ergibt (nachwievor(neben: mit DB verbunden. Es gibt 193 Ergebnisse))
> ein "schnödes"
>
> S

$f enthält nach wie vor keinen Datensatz. Erklärung siehe oben.

MfG
Niels

--
Mir fehlen die Kenntnisse, um überhaupt eine Vorstellung davon zu
haben, wo ich ansetzen kann den Fehler zu suchen. Einen
Programmierfehler kann ich aber ausschließen.
[Florian Steyer in dclpi]

Re: Var. aus 3 Feldern zusammenstellen

am 10.11.2004 00:37:51 von j_wenke

Hallo Niels,

suuper erklärt. Vielen Dank!!
Das muß ich natürlich trotzdem noch "verdauen" ... ;-)
- und dann weitermachen.

Es funktioniert jetzt!

Arbeiten kann ich hier übrigens nur mit MySQL 3.23.39 und 3.23.57
- wegen der CAST-Funktion!?
....
>Mir fehlen die Kenntnisse, um überhaupt eine Vorstellung davon zu
haben, ...
:-)
Gruß, Jörg

Re: Var. aus 3 Feldern zusammenstellen

am 10.11.2004 00:51:01 von Niels Braczek

j wenke schrieb:

> Es funktioniert jetzt!

Prima.

> Arbeiten kann ich hier übrigens nur mit MySQL 3.23.39 und 3.23.57
> - wegen der CAST-Funktion!?

Macht nichts; du brauchst die CAST()-Funktion ja nicht.

MfG
Niels

--
Eigendlich is n Standart in der Rechtschreibung föllig
egal. Hauptsache is, mann ferstet mich! Ich kapier nur
ned, wiso der PHP-Pharser immer mekert?