/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
PEAR::DB::query("UPDATE...") returnerer in~
Fra : Niels Andersen


Dato : 06-12-02 20:44

$db = DB::connect("mysql://...", true);
[...]
var_dump($db->query("UPDATE ..."));

output:
int(1)

Alle andre queries jeg har prøvet med (bla. select og show) giver en fin
DB_Result tilbage.
Ifølge dokumentationen kommer der altid en DB_Result eller en DB_Error
tilbage. Hvorfor får jeg så bare en 1'er?

Opgradering fra en halvgammen pear til en næsten ny (hentet fra Debian
unstable i dag) ændrede intet...

Er der andre der har set det før?

Jeg tillader mig lige at spørge inden jeg har taget den komplette debug-tur
igennem (bla. fjerne alt der kan fjernes), da det haster. Men det vil jeg
gøre mens jeg venter på svar. :)

--
Mvh.

Niels Andersen
(la nels. anersyn.)

 
 
Niels Andersen (06-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 06-12-02 20:50

Niels Andersen wrote in <X57I9.60583$HU.4166399@news010.worldonline.dk>:
> Jeg tillader mig lige at spørge inden jeg har taget den komplette
> debug-tur igennem (bla. fjerne alt der kan fjernes), da det haster. Men
> det vil jeg gøre mens jeg venter på svar. :)

Jeg får stadig bare int(1). ARGH! :)

#!/usr/bin/php4 -qC
<?php
require_once('DB.php');
$db = DB::connect("mysql://***_dk:***@mysql.***.dk/**_dk");
var_dump($db->query("UPDATE temp SET word = word"));
?>

--
Mvh.

Niels Andersen

Niels Andersen (06-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 06-12-02 22:04

Niels Andersen wrote in <3c7I9.60612$HU.4166897@news010.worldonline.dk>:
> Jeg får stadig bare int(1). ARGH! :)
> var_dump($db->query("UPDATE temp SET word = word"));

Løsning:

$db->query("UPDATE ...");
$affectedrows = $db->affectedRows();

Det passer ikke lige med manualen, men det virker. Jeg laver nok en
bug-report senere.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Michael Rasmussen (06-12-2002)
Kommentar
Fra : Michael Rasmussen


Dato : 06-12-02 23:01

On Fri, 06 Dec 2002 22:03:49 +0100, Niels Andersen wrote:

> Niels Andersen wrote in
> <3c7I9.60612$HU.4166897@news010.worldonline.dk>:
>> Jeg får stadig bare int(1). ARGH! :) var_dump($db->query("UPDATE
>> temp SET word = word"));
>
> Løsning:
>
> $db->query("UPDATE ...");
> $affectedrows = $db->affectedRows();
>
> Det passer ikke lige med manualen, men det virker. Jeg laver nok en
> bug-report senere.
Hej Niels,

Har lige læst beskrivelsen hos Pear og her fremgår det, at den som
input tager en variabel, men forholder det sig ikke sådan, at
DB::Connect i princippet returnerer en file descripter? Læser du om
xyx_connect på php.net, vil du også se, at disse funktioner
returnerer en ressource, som de forskellige andre DB-funktioner kan
anvende. Det er lidt ligesom i C/C++, hvor en file descripter også
er en integer, og de forskellige funktioner, der skal tilgå filen,
ved så hvordan en forbindelse åbnes, og ikke mindst hvordan
resultatet læses. Det din variabel udskriver er sådan set blot, at
du har fået tildelt en ressource med nummeret 1. En anden variant
kunne være, at den opfatter det boolsk, dvs. en ressource hvor
værdien er > 0 er true. Passer også ind i første variant, da den ved
ingen connection vil returnere false. PHP følger her C/C++
standarden, hvor alle værdier forskellig fra 0 (nul) er true, mens
værdien 0 (nul) er lig med false. Læg også mærke til at jeg ikke
skriver null, da det er noget helt andet, og også har forskellig
betydning i C/PHP og C++.

Håber mine små kommentarer giver dig et hint til løsningen.
--
Hilsen/Sincerely
Michael Rasmussen

"C makes it easy to shoot yourself in the foot; C++ makes it harder,
but when you do, it blows away your whole leg." - Bjarne Stroustrup
-------------------------------------------------------------------
Fjern NOSPAM fra min adresse, for at sende mig en mail


Niels Andersen (07-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 07-12-02 14:57

Michael Rasmussen wrote in <pan.2002.12.06.22.00.33.262876@datanom.net>:

> On Fri, 06 Dec 2002 22:03:49 +0100, Niels Andersen wrote:
>
>> Niels Andersen wrote in
>> Løsning:
>> $db->query("UPDATE ...");
>> $affectedrows = $db->affectedRows();

> Har lige læst beskrivelsen hos Pear og her fremgår det, at den som
> input tager en variabel,

Hvilken "den"?

> men forholder det sig ikke sådan, at
> DB::Connect i princippet returnerer en file descripter?

Nej, den returnerer et pear object, også ved fejl.

> Læser du om
> xyx_connect på php.net, vil du også se, at disse funktioner
> returnerer en ressource, som de forskellige andre DB-funktioner kan
> anvende.

Ja, men PEAR::DB er jo et abstraktionslag, så det kan du ikke bruge til
noget.

> Det er lidt ligesom i C/C++, hvor en file descripter også
> er en integer, og de forskellige funktioner, der skal tilgå filen,
> ved så hvordan en forbindelse åbnes, og ikke mindst hvordan
> resultatet læses.

I PHP er de forskellige pointere i dag en "ressource". Tidligere var det
bare en integer.
I PEAR::DB bliver der returneret objekter, som aflæses ved at bruge
objektets egne metoder.

> Det din variabel udskriver er sådan set blot, at
> du har fået tildelt en ressource med nummeret 1.

Nej, sådan er PHP ikke, ikke længere. Og PEAR::DB har vist aldrig fungeret
på den måde.

> Håber mine små kommentarer giver dig et hint til løsningen.

Sjovt svar at skrive til en løsning.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Michael Rasmussen (07-12-2002)
Kommentar
Fra : Michael Rasmussen


Dato : 07-12-02 15:55

On Sat, 07 Dec 2002 14:56:44 +0100, Niels Andersen wrote:

> Michael Rasmussen wrote in
> <pan.2002.12.06.22.00.33.262876@datanom.net>:
>
>> On Fri, 06 Dec 2002 22:03:49 +0100, Niels Andersen wrote:
>>
>>> Niels Andersen wrote in
>>> Løsning:
>>> $db->query("UPDATE ...");
>>> $affectedrows = $db->affectedRows();
>
>> Har lige læst beskrivelsen hos Pear og her fremgår det, at den
>> som input tager en variabel,
>
> Hvilken "den"?
>
var_dump($db->query("UPDATE ..."));
Det var ovenstående, jeg referede til.

En kommentar til at PEAR::DB er et abstraktionslag. Det er vi helt
enige om, men fordi en klasse er et abstraktionslag, betyder det
ikke samtidig, at det ændrer på de underliggende funktioners
returtype. Var det tilfældet, ville jeg mene, at abstraktionslaget
var kodet forkert. En ting er at introducere nye funktioner/metoder,
med vær deres egne returtyper, men at ændre på de indbyggede
funktioners returtype, mener jeg, er farligt.

Så for at gøre en lang historie kort er jeg af den opfattelse, at
var_dump forventer en type som indput*), hvorimod PEAR::DB returnerer
objekter, og derfor vil var_dump udskrive ressourcens ID i stedet
for.

*) I PHP findes typen integer, real, string og array.
--
Hilsen/Sincerely
Michael Rasmussen

"C makes it easy to shoot yourself in the foot; C++ makes it harder,
but when you do, it blows away your whole leg." - Bjarne Stroustrup
-------------------------------------------------------------------
Fjern NOSPAM fra min adresse, for at sende mig en mail


Niels Andersen (07-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 07-12-02 16:37

Michael Rasmussen wrote in <pan.2002.12.07.14.54.39.333156@datanom.net>:
>>> Har lige læst beskrivelsen hos Pear og her fremgår det, at den
>>> som input tager en variabel,
>> Hvilken "den"?
> var_dump($db->query("UPDATE ..."));
> Det var ovenstående, jeg referede til.

var_dump? Den tager hvad som helst. Den har i hvert fald ikke brækket sig
over noget som helst jeg har givet den endnu.

> En kommentar til at PEAR::DB er et abstraktionslag. Det er vi helt
> enige om, men fordi en klasse er et abstraktionslag, betyder det
> ikke samtidig, at det ændrer på de underliggende funktioners
> returtype.

Det betyder i hvert fald, at dokumentationen for "de underliggende
funktioner" ikke kan bruges på abstraktionslaget.

Hele meningen med abstraktionslaget er jo, at det skal fungere anderledes.
Ellers ville det da være overflødigt. Det behøver godt nok ikke at være
*alt* der er anderledes. Men du argumenterede for abstraktionslagets
funktionalitet, med dokumentationen for de underliggende funktioner. Det
kan man ikke.

> Var det tilfældet, ville jeg mene, at abstraktionslaget
> var kodet forkert. En ting er at introducere nye funktioner/metoder,
> med vær deres egne returtyper, men at ændre på de indbyggede
> funktioners returtype, mener jeg, er farligt.

Jeg synes det virker fint. Mit problem her skyldtes udelukkende at der blev
returneret noget som *ikke* var et objekt..

> Så for at gøre en lang historie kort er jeg af den opfattelse, at
> var_dump forventer en type som indput*), hvorimod PEAR::DB returnerer
> objekter, og derfor vil var_dump udskrive ressourcens ID i stedet
> for.
>
> *) I PHP findes typen integer, real, string og array.

var_dump() kan sagtens klare mere end de nævnte typer. Prøv selv at lege med
det.
Giver man den fx. en ressource, så fortæller den at det er en ressource, og
giver id'en. Det fortæller vist også hvad det er for en slags ressource.
Giver man den et objekt, så giver den en rekursiv liste over alle felterne i
objektet. Prøv selv at fodre den med nogle af de forskellige objekter
PEAR:DB laver.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Michael Rasmussen (07-12-2002)
Kommentar
Fra : Michael Rasmussen


Dato : 07-12-02 17:04

On Sat, 07 Dec 2002 16:37:08 +0100, Niels Andersen wrote:

> Det betyder i hvert fald, at dokumentationen for "de underliggende
> funktioner" ikke kan bruges på abstraktionslaget.
>
> Hele meningen med abstraktionslaget er jo, at det skal fungere
> anderledes. Ellers ville det da være overflødigt. Det behøver
> godt nok ikke at være *alt* der er anderledes. Men du argumenterede
> for abstraktionslagets funktionalitet, med dokumentationen for de
> underliggende funktioner. Det kan man ikke.
>
Her tror jeg, vi er uenige For mig betyder et abstraktionslag, at
tilgangen til funktioner/metoder gøres

1) transparent for brugerne.
2) Giver en ensartet implementation

>
> var_dump() kan sagtens klare mere end de nævnte typer. Prøv selv
> at lege med det.
> Giver man den fx. en ressource, så fortæller den at det er en
> ressource, og giver id'en. Det fortæller vist også hvad det er for
> en slags ressource. Giver man den et objekt, så giver den en
> rekursiv liste over alle felterne i objektet. Prøv selv at fodre
> den med nogle af de forskellige objekter PEAR:DB laver.
Ja, det lyder til, at funktionen har nogen spændende muligheder, så
jeg vil følge din opfordring.

--
Hilsen/Sincerely
Michael Rasmussen

"C makes it easy to shoot yourself in the foot; C++ makes it harder,
but when you do, it blows away your whole leg." - Bjarne Stroustrup
-------------------------------------------------------------------
Fjern NOSPAM fra min adresse, for at sende mig en mail


Christian Joergensen (07-12-2002)
Kommentar
Fra : Christian Joergensen


Dato : 07-12-02 17:15

On Sat, 07 Dec 2002 17:03:43 +0100, Michael Rasmussen wrote:

[snip - hvad er abstraktion]

> 2) Giver en ensartet implementation

Det medfører jo også at der ændres på dels navne og dels retur-værdierne i
forhold til de eksisterende "lowlevel" PHP funktioner til det samme.

--
Christian Jørgensen | Do not look into the laser with remaining eye!
http://www.razor.dk |


Niels Andersen (07-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 07-12-02 18:02

Michael Rasmussen wrote in <pan.2002.12.07.16.03.41.473921@datanom.net>:
>> Hele meningen med abstraktionslaget er jo, at det skal fungere
>> anderledes.
[...]
> Her tror jeg, vi er uenige For mig betyder et abstraktionslag, at
> tilgangen til funktioner/metoder gøres
>
> 1) transparent for brugerne.
> 2) Giver en ensartet implementation

Det vil ofte også kræve ændringer i hvad der bliver returneret.
Fx. kan man ikke lave et db-abstraktionslag til php, uden at det må
returnere noget andet, end de "rå" funktioner gør.

Så vidt jeg husker vil fx. mysql_query returnere en mysql resource.
En af fordelene ved et db-abstraktionslag er, at man kun skal ændre i
abstrationslagets opsætning, for at skifte database. Fx. fra MySQL til
PostGreSQL. Men jeg vil tro at en mysql resource kun kan læses af
mysql-funktionerne.

Altså er abstraktionslaget nødt til at ændre både hvordan man kalder
databasen, samt hvad der kommer retur.
Og så fungerer det anderledes. Både hvordan man kalder databasen, hvordan
man giver den input (dvs. noget SQL og evt. nogle parametre) samt hvad der
kommer retur.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Niels Andersen (07-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 07-12-02 18:06

Michael Rasmussen wrote in <pan.2002.12.07.14.54.39.333156@datanom.net>:
> Så for at gøre en lang historie kort er jeg af den opfattelse, at
> var_dump forventer en type som indput*)
[...]
> *) I PHP findes typen integer, real, string og array.

Jeg måtte lige slå op, jeg har vist ikke læst i manualen om var_dump() i
flere år. :)

"This function returns structured information about one or more expressions
that includes its type and value."

Selv ifølge dokumentationen er det altså ikke en type den vil have, men et
udtryk. Og et udtryk, det er jo nærmest hvad som helst. :)

var_dump(5);
var_dump('test');
var_dump(echo('test'));
var_dump(fopen('sletmig','w')):

Den æder hvad som helst. :)
Men i de to sidste kan det godt være svært for en begynder at gennemskue
hvad der foregår. :)

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Nezar Nielsen (09-12-2002)
Kommentar
Fra : Nezar Nielsen


Dato : 09-12-02 10:13

Niels Andersen wrote:

>> Jeg får stadig bare int(1). ARGH! :)
>> var_dump($db->query("UPDATE temp SET word = word"));

....

> Det passer ikke lige med manualen, men det virker. Jeg laver nok en
> bug-report senere.

Mjoeh, det kommer an på hvor man kigger..

http://pear.php.net/manual/en/core.db.query.php siger:
Returns - resource - a new DB_Result or a DB_Error when fail

mens http://pear.php.net/manual/en/core.db.tut_query.php siger:
On succes you get DB_OK (predefined PEAR::DB constant) or when you set a
SELECT-statment a DB Result object.


--
Regards,
Nezar Nielsen

Worldfamous sheepherder.


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste