Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

En hård fødsel (php/mySQL)

4 views
Skip to first unread message

Kurt Hansen

unread,
Dec 13, 2012, 5:17:51 AM12/13/12
to
Ikke at jeg vil g� i gang med et flere �rigt studium, men et
grundl�ggende kendskab til php/mySQL ville nok ikke v�re nogen skade til.

Jeg fandt en tutorial, hvor det engelske sprog ikke er s� teknisk, men
allerede i de indledende �velser, g�r det galt.

Eksemplet med at connecte til serveren og derp� til en database g�r
fint. Da jeg ikke lige havde tid til at forts�tte, ville jeg logge ud
igen, men det har de �benbart gemt til en senere lektion. Det kan godt
v�re at jeg er overf�lsom, men at lukke d�ren efter mig, sidder dybt i
fl�sket p� mig.

Ok, jeg fandt en anden tut og spillede igennem, men ogs� den giver
syntaxfejl, selv om jeg paster direkte fra hjemmesiderne.

Tut 1: http://www.tizag.com/mysqlTutorial/mysqlconnection.php
Tut 2: http://www.w3resource.com/mysql/mysql-connection.php

Er det tutterne der er noget galt med, eller er det mig? Hvordan
disconnecter man (inkl. sk�rmkvittering for handlingens udf�relse)?


Server: Localhost via UNIX socket
Programmel: MySQL
Programmelversion: 5.1.48 - MySQL Community Server (GPL)
Protokolversion: 10
Bruger: kurt_dk@localhost
Servers tegns�t: UTF-8 Unicode (utf8)
Apache/1.3.42 (Unix) PHP/5.3.2
Databaseklientversion: libmysql - 5.1.48
PHP udvidelse: mysqli Dokumentation

--
Venlig hilsen
Kurt Hansen

Leif Neland

unread,
Dec 13, 2012, 7:46:26 AM12/13/12
to
Kurt Hansen forklarede den 13-12-2012:
> Ikke at jeg vil gå i gang med et flere årigt studium, men et grundlæggende
> kendskab til php/mySQL ville nok ikke være nogen skade til.
>
> Jeg fandt en tutorial, hvor det engelske sprog ikke er så teknisk, men
> allerede i de indledende øvelser, går det galt.
>
> Eksemplet med at connecte til serveren og derpå til en database går fint. Da
> jeg ikke lige havde tid til at fortsætte, ville jeg logge ud igen, men det
> har de åbenbart gemt til en senere lektion. Det kan godt være at jeg er
> overfølsom, men at lukke døren efter mig, sidder dybt i flæsket på mig.
>
> Ok, jeg fandt en anden tut og spillede igennem, men også den giver
> syntaxfejl, selv om jeg paster direkte fra hjemmesiderne.
>
> Tut 1: http://www.tizag.com/mysqlTutorial/mysqlconnection.php
> Tut 2: http://www.w3resource.com/mysql/mysql-connection.php
>
> Er det tutterne der er noget galt med, eller er det mig? Hvordan disconnecter
> man (inkl. skærmkvittering for handlingens udførelse)?
>
>
>
Når du starter på en frisk, kan du lige så godt bruge mysqli i stedet
for mysql, der bliver markeret som forældet, "depreciated" i en af de
næste php-versioner.

F.ex:
http://www.dreamincode.net/forums/topic/54239-introduction-to-mysqli-and-prepared-statements/

Du kan det samme i mysqli som i mysql, bare ved at sætte i'et på,
virker de fleste ting på samme måde, men du kan mere i mysqli, f.ex. de
berømte prepared statements.

Du skal ikke bekymre dig om at logge ud, det sker automatisk, når
scriptet er færdigt.

http://stackoverflow.com/questions/3359716/do-i-really-need-to-do-mysql-close

Leif

--
Husk kørelys bagpå, hvis din bilfabrikant har taget den idiotiske
beslutning at undlade det.


Martin

unread,
Dec 13, 2012, 8:01:59 AM12/13/12
to
On 13-12-2012 11:17, Kurt Hansen wrote:
> Ikke at jeg vil gå i gang med et flere årigt studium, men et
> grundlæggende kendskab til php/mySQL ville nok ikke være nogen skade til.
>
> Jeg fandt en tutorial, hvor det engelske sprog ikke er så teknisk, men
> allerede i de indledende øvelser, går det galt.
>
> Eksemplet med at connecte til serveren og derpå til en database går
> fint. Da jeg ikke lige havde tid til at fortsætte, ville jeg logge ud
> igen, men det har de åbenbart gemt til en senere lektion. Det kan godt
> være at jeg er overfølsom, men at lukke døren efter mig, sidder dybt i
> flæsket på mig.
>
> Ok, jeg fandt en anden tut og spillede igennem, men også den giver
> syntaxfejl, selv om jeg paster direkte fra hjemmesiderne.
>
> Tut 1: http://www.tizag.com/mysqlTutorial/mysqlconnection.php
> Tut 2: http://www.w3resource.com/mysql/mysql-connection.php
>
> Er det tutterne der er noget galt med, eller er det mig? Hvordan
> disconnecter man (inkl. skærmkvittering for handlingens udførelse)?

1: Hvis du ser en tutorial hvor mysql_connect bliver brugt, så tager du
tutorialen og smider den aller helvedes væk :)
Husk at mysql_* er deprecated, sløv, gammel og er fejlbehæftet.

Istedet så søger du efter php pdo tutorial
<http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/>
<http://www.phpeveryday.com/articles/PHP-Data-Object/PDO-Tutorial-P842.html>
Den sidste er god, da den er opdelt i faser

-- Connecte til databasen
$DBH = new PDO("mysql:host=HOST;dbname=DATABASENAVN", BRUGERNAVN, KODEORD);
(alt med stort erstattes af dine egne variabler)

-- Indsætte i databasen (unnamed placeholders)
$STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?);
(preparing dine felter, alle spørgsmåls tegn erstattes af nedenstående
variabler)

$name = "Daniel"
$addr = "1 Wicked Way";
$city = "Arlington Heights";

$STH->bindParam(1, $name);
$STH->bindParam(2, $addr);
$STH->bindParam(3, $city);

$STH->execute(); // Her udføres queryen

$name = "Endnu en"
$addr = "Adresse";
$city = "i en by";

$STH->execute(); // Her udføres queryen 2. gang, bemærk vi behøver ikke
binde variablerne, da de allerede er bundet

Istedet for ? i queryen så kan vi også lege med named placeholder

-- Indsætte i databasen (named placeholders)
$data = array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city'
=> 'Cardiff' );
$STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr,
:city)");

$STH->execute($data);

$moredata = array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty',
'city' => 'Cardiff' );

$STH->execute($moredata);

-- Selecte data
$STH = $DBH->query('SELECT name, addr, city from folks');
$STH->setFetchMode(PDO::FETCH_ASSOC);
while($row = $STH->fetch()) {
echo $row['name'] . "\n";
echo $row['addr'] . "\n";
echo $row['city'] . "\n";
}

Denne ligner meget mysql_select delen, så den går vi ikke nærmere med

-- Update
$STH = $DBH->("UPDATE books SET title=?, author=? WHERE id = ?");
$STH->bindParam(1, 'Min titel');
$STH->bindParam(2, 'Forfatter');
$STH->bindParam(3, 2); // ID
$STH->execute();

Det kan også gøres med named placeholders selvfølgelig

$STH = $DBH->("UPDATE books SET title=:bogtitel, author=:forfatter WHERE
id = :uniknummer");

$data = array(
'bogtitel' => 'Min titel',
'forfatter' => 'Ole Bole',
'uniknummer' => 5
);

$STH->execute($data);

Så PDO handler om at binde variabler istedet for bare at indsætte det
direkte i databasen.

Hvad fordelen er at PDO selv tjekker for alt muligt såsom hvad input er osv.

Dvs at
'bogtitel' => 'Min titel\';delete from books where 1=1;/*'

ikke er muligt

Leif Neland

unread,
Dec 13, 2012, 9:45:46 AM12/13/12
to
Martin forklarede den 13-12-2012:
> On 13-12-2012 11:17, Kurt Hansen wrote:

> Istedet sᅵ sᅵger du efter php pdo tutorial
Der er bare lige lidt fejl...
>
> -- Connecte til databasen
> $DBH = new PDO("mysql:host=HOST;dbname=DATABASENAVN", BRUGERNAVN, KODEORD);
> (alt med stort erstattes af dine egne variabler)
>
> -- Indsᅵtte i databasen (unnamed placeholders)
> $STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?);

Mangler "prepare"
$STH = $DBH->prepare("INSERT....

> (preparing dine felter, alle spᅵrgsmᅵls tegn erstattes af nedenstᅵende
> variabler)
>
>
> Istedet for ? i queryen sᅵ kan vi ogsᅵ lege med named placeholder
>
> -- Indsᅵtte i databasen (named placeholders)
> $STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr,
> :city)");

Mangler "prepare"
$STH = $DBH->prepare("INSERT....


>
> -- Update
> $STH = $DBH->("UPDATE books SET title=?, author=? WHERE id = ?");

Mangler "prepare"
$STH = $DBH->prepare("UPDATE....


>
> Det kan ogsᅵ gᅵres med named placeholders selvfᅵlgelig
>
> $STH = $DBH->("UPDATE books SET title=:bogtitel, author=:forfatter WHERE id =
> :uniknummer");

Mangler "prepare"
$STH = $DBH->prepare("INSERT....


>
> $data = array(
> 'bogtitel' => 'Min titel',
> 'forfatter' => 'Ole Bole',
> 'uniknummer' => 5
> );
>
> Hvad fordelen er at PDO selv tjekker for alt muligt sᅵsom hvad input er osv.
>
> Dvs at
> 'bogtitel' => 'Min titel\';delete from books where 1=1;/*'
>

Jo, men sᅵ kommer titlen bare til at hedde det :-)

http://xkcd.com/327/

Leif

--
Husk kᅵrelys bagpᅵ, hvis din bilfabrikant har taget den idiotiske
beslutning at undlade det.


Martin

unread,
Dec 13, 2012, 12:22:06 PM12/13/12
to
On 13-12-2012 15:45, Leif Neland wrote:
> Martin forklarede den 13-12-2012:
>> On 13-12-2012 11:17, Kurt Hansen wrote:
>
>> Istedet så søger du efter php pdo tutorial
>> -- Indsætte i databasen (unnamed placeholders)
>> $STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?);
>
> Mangler "prepare"
> $STH = $DBH->prepare("INSERT....

copy'n'paste er aldrig godt :)

>>
>> Hvad fordelen er at PDO selv tjekker for alt muligt såsom hvad input
>> er osv.
>>
>> Dvs at
>> 'bogtitel' => 'Min titel\';delete from books where 1=1;/*'
>>
>
> Jo, men så kommer titlen bare til at hedde det :-)

Jeps, også det jeg mente ;-)
Men den går ikke ind og sletter alle bøger

Arne Vajhøj

unread,
Dec 13, 2012, 11:11:09 PM12/13/12
to
On 12/13/2012 7:46 AM, Leif Neland wrote:
> Når du starter på en frisk, kan du lige så godt bruge mysqli i stedet
> for mysql,

Yes.

Eller PDO.

> der bliver markeret som forældet, "depreciated" i en af de
> næste php-versioner.

For en nogle måneder siden blev der klistet følgende på dokumentationen:

<quote>
Use of this extension is discouraged. Instead, the MySQLi or PDO_MySQL
extension should be used.
</quote>

Så den er allerede discouraged.

> Du skal ikke bekymre dig om at logge ud, det sker automatisk, når
> scriptet er færdigt.
>
> http://stackoverflow.com/questions/3359716/do-i-really-need-to-do-mysql-close

Bemærk at de anbefalder ikke at man undlader at kalde close. De noterer
at der bliver closet når siden er færdig processet, men de anbefaler
faktisk at man selv lukker - fordi der er i nogle tilfælde kan gå
noget tid mellem at siden er færdig med at bruge MySQL og siden er
færdig processet.

Arne

Arne Vajhøj

unread,
Dec 13, 2012, 11:26:06 PM12/13/12
to
On 12/13/2012 8:01 AM, Martin wrote:
> On 13-12-2012 11:17, Kurt Hansen wrote:
>> Ikke at jeg vil gå i gang med et flere årigt studium, men et
>> grundlæggende kendskab til php/mySQL ville nok ikke være nogen skade til.
>>
>> Jeg fandt en tutorial, hvor det engelske sprog ikke er så teknisk, men
>> allerede i de indledende øvelser, går det galt.
>>
>> Eksemplet med at connecte til serveren og derpå til en database går
>> fint. Da jeg ikke lige havde tid til at fortsætte, ville jeg logge ud
>> igen, men det har de åbenbart gemt til en senere lektion. Det kan godt
>> være at jeg er overfølsom, men at lukke døren efter mig, sidder dybt i
>> flæsket på mig.
>>
>> Ok, jeg fandt en anden tut og spillede igennem, men også den giver
>> syntaxfejl, selv om jeg paster direkte fra hjemmesiderne.
>>
>> Tut 1: http://www.tizag.com/mysqlTutorial/mysqlconnection.php
>> Tut 2: http://www.w3resource.com/mysql/mysql-connection.php
>>
>> Er det tutterne der er noget galt med, eller er det mig? Hvordan
>> disconnecter man (inkl. skærmkvittering for handlingens udførelse)?
>
> 1: Hvis du ser en tutorial hvor mysql_connect bliver brugt, så tager du
> tutorialen og smider den aller helvedes væk :)
> Husk at mysql_* er deprecated, sløv, gammel og er fejlbehæftet.

Discouraged ikke deprecated. Den bliver deprecated senere.

Det er en myte at mysqli er meget hurtigere end mysql. Nogen gange
er den lidt hurtigere. Andre gange er den lidt langsommere.

Den er gammel. Men hvis der ellers ikke er noget galt er det jo
en fordel.

Der er ikke ret mange åbne bugs på mysql extension i PHP
bug tracker. Har du glemt at rapportere de fejl?

> Istedet så søger du efter php pdo tutorial

Det er et glimrende råd.

> Så PDO handler om at binde variabler istedet for bare at indsætte det
> direkte i databasen.
>
> Hvad fordelen er at PDO selv tjekker for alt muligt såsom hvad input er
> osv.
>
> Dvs at
> 'bogtitel' => 'Min titel\';delete from books where 1=1;/*'
>
> ikke er muligt

Det er heller ikke muligt i mysql extension.

Hvilket jeg mener at jeg også forklarede dig i
sidste uge i en anden tråd.

Arne

Kurt Hansen

unread,
Dec 14, 2012, 12:09:34 AM12/14/12
to
Den 14/12/12 05.11, Arne Vajhøj skrev:
> On 12/13/2012 7:46 AM, Leif Neland wrote:
>> Når du starter på en frisk, kan du lige så godt bruge mysqli i stedet
>> for mysql,
>
> Yes.
>
> Eller PDO.

Eller hvad med FDB eller DSB? Ja, undskyld mig, men er der noget at sige
til, at en grønskolling bliver forvirret?

er mysqli og PDO to forskellige varianter af SQL med forskellige
specifikationer?

> Bemærk at de anbefalder ikke at man undlader at kalde close. De noterer
> at der bliver closet når siden er færdig processet, men de anbefaler
> faktisk at man selv lukker - fordi der er i nogle tilfælde kan gå
> noget tid mellem at siden er færdig med at bruge MySQL og siden er
> færdig processet.

Det var lige præcist det jeg fik banket ind i knolden i sin tid. Det er
god skik, uanset om det, i den aktuelle session, er påkrævet eller ej.

Kurt Hansen

unread,
Dec 14, 2012, 12:12:14 AM12/14/12
to
Den 14/12/12 05.26, Arne Vajhøj skrev:

> Det er heller ikke muligt i mysql extension.

Hvorfor bruger I udtrykket "extension"? For mig er det en form for
udvidelse.

Er mysql en udvidelse/plugin og i givet fald til hvad? Det forstår jeg
ikke helt.

Leif Neland

unread,
Dec 14, 2012, 1:03:48 AM12/14/12
to
Kurt Hansen frembragte:
> Den 14/12/12 05.26, Arne Vajhøj skrev:
>
>> Det er heller ikke muligt i mysql extension.
>
> Hvorfor bruger I udtrykket "extension"? For mig er det en form for udvidelse.
>
> Er mysql en udvidelse/plugin og i givet fald til hvad? Det forstår jeg ikke
> helt.

Ja; der er mange udvidelser til php, de fleste er standard på de fleste
webhoteller, sp det er ikke noget, du skal slå til selv.

Leif

--
Husk kørelys bagpå, hvis din bilfabrikant har taget den idiotiske
beslutning at undlade det.


Leif Neland

unread,
Dec 14, 2012, 1:33:31 AM12/14/12
to
Kurt Hansen sendte dette med sin computer:
> Den 14/12/12 05.11, Arne Vajhøj skrev:
>> On 12/13/2012 7:46 AM, Leif Neland wrote:
>>> Når du starter på en frisk, kan du lige så godt bruge mysqli i stedet
>>> for mysql,
>>
>> Yes.
>>
>> Eller PDO.
>
> Eller hvad med FDB eller DSB? Ja, undskyld mig, men er der noget at sige til,
> at en grønskolling bliver forvirret?
>
> er mysqli og PDO to forskellige varianter af SQL med forskellige
> specifikationer?

Nej, det er laget imellem php og mysql-databasen.

Fordelen med PDO er, at det kun er når du connecter til databasen, at
du skal vælge hvilken databasetype du bruger, resten af koden er
uafhængig af hvilken databasetype, du bruger.

PDO kan køre op i mod disse:

CUBRID (PDO) — CUBRID Functions (PDO_CUBRID)
MS SQL Server (PDO) — Microsoft SQL Server and Sybase Functions
Firebird/Interbase (PDO) — Firebird/Interbase Functions (PDO_FIREBIRD)
IBM (PDO) — IBM Functions (PDO_IBM)
Informix (PDO) — Informix Functions (PDO_INFORMIX)
MySQL (PDO) — MySQL Functions (PDO_MYSQL)
MS SQL Server (PDO) — Microsoft SQL Server Functions (PDO_SQLSRV)
Oracle (PDO) — Oracle Functions (PDO_OCI)
ODBC and DB2 (PDO) — ODBC and DB2 Functions (PDO_ODBC)
PostgreSQL (PDO) — PostgreSQL Functions (PDO_PGSQL)
SQLite (PDO) — SQLite Functions (PDO_SQLITE)
4D (PDO) — 4D Functions (PDO_4D)

Det er bare at skrive det rigtige i connect-sætningen.

Uden PDO ville du skulle skifte alle dine mysqli_query() ud med

ifx_query() til informix
pg_query() til postgresql
sqlite_query() til sqlite
og så videre, hvis du vil skifte database.

Arne Vajhøj

unread,
Dec 14, 2012, 8:40:26 AM12/14/12
to
On 12/14/2012 12:09 AM, Kurt Hansen wrote:
> Den 14/12/12 05.11, Arne Vajhøj skrev:
>> On 12/13/2012 7:46 AM, Leif Neland wrote:
>>> Når du starter på en frisk, kan du lige så godt bruge mysqli i stedet
>>> for mysql,
>>
>> Yes.
>>
>> Eller PDO.
>
> Eller hvad med FDB eller DSB? Ja, undskyld mig, men er der noget at sige
> til, at en grønskolling bliver forvirret?
>
> er mysqli og PDO to forskellige varianter af SQL med forskellige
> specifikationer?

mysql og mysqli er PHP API'er for at tilgå MySQL databaser.

PDO er et PHP API for at tilgå databaser herunder MySQL databaser.

http://php.net/manual/en/refs.database.php

Arne


Arne Vajhøj

unread,
Dec 14, 2012, 8:55:05 AM12/14/12
to
On 12/14/2012 12:12 AM, Kurt Hansen wrote:
> Den 14/12/12 05.26, Arne Vajhøj skrev:
>> Det er heller ikke muligt i mysql extension.
>
> Hvorfor bruger I udtrykket "extension"? For mig er det en form for
> udvidelse.
>
> Er mysql en udvidelse/plugin og i givet fald til hvad? Det forstår jeg
> ikke helt.

PHP er opbygget modulært, så i.s.f. en enkelt kæmpe stor klump
(det som man vil kalde monolitisk i fag sproget) består det af
en mindre kerne og et stort antal ekstra moduler som kan loades
efter behov. Disse moduler kaldes extensions i PHP terminologi.
Man angiver hvilke man skal have loadet i php.ini.

Eksempel:

;extension=php_interbase.dll
extension=php_mysql.dll
extension=php_mysqli.dll
;extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client
;extension=php_oci8_11g.dll ; Use with Oracle 11g Instant Client
;extension=php_pdo_firebird.dll
;extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll

Et semikolon er en udkommentering som gør at extension ikke
loades.

Arne

0 new messages