Avatar billede bing89 Nybegynder
09. september 2014 - 08:19 Der er 8 kommentarer og
1 løsning

PDO bindParam->(':var', $var, PDO::PARAM_STR) - Hvorfor PDO::PARAM_STR ?

Hej..

Jeg har i længere tid benyttet mig af PDO prepared statement; men er nu kommet i tvivl om hvad PDO::PARAM_STR, PDO::PARAM_INT osv. gør.

Mit første gæt var at PDO::PARAM virker lidt ligesom "real escape string" - hvilket det nok også gør..

Men hvorfor er der flere slags af dem?

PDO::PARAM_STR
PDO::PARAM_INT
PDO::PARAM_BOOL

osv.

PDO::PARAM_INT kontrollerer jo ikke om det er et tal.. ?

Er det derudover rigtigt forstået, at prepared statement er mere sikkert pga. det gennenmgår flere steps ?
Avatar billede arne_v Ekspert
09. september 2014 - 16:46 #1
Prepared statement er mere sikkert fordi det beskytter effektivt mod SQL injection ved brug af databasens funktionalitet.

"real escape string" er et client side hack.
Avatar billede arne_v Ekspert
09. september 2014 - 16:49 #2
PDO understoetter mange forskellige databaser.

Og enten er der nogen databaser eller dem designede PDO ville forberede sig paa databaser, hvor det underliggende database API insisterer paa at faa en type angivet.
Avatar billede bing89 Nybegynder
09. september 2014 - 18:18 #3
Tak for dit svar; og det giver god mening med din beskrivelse af hvorfor der er flere datatyper..
Men betyder det, at datatyperne er overflødige ved brug af MySQL?
Avatar billede arne_v Ekspert
09. september 2014 - 18:28 #4
Godt spoergsmaal. Jeg ved det ikke. Du har ikke mulighed for at teste det da der aktid angives en - default er PDO::PARAM_STR.

Bemaerk at mysqli ogsaa kraever at man angiver type. Men det er ikke helt de samme muligheder som ved PDO.

mysqli:

Character     Description
i     corresponding variable has type integer
d     corresponding variable has type double
s     corresponding variable has type string
b     corresponding variable is a blob and will be sent in packets

PDO:

PDO::PARAM_BOOL (integer)
    Represents a boolean data type.
PDO::PARAM_NULL (integer)
    Represents the SQL NULL data type.
PDO::PARAM_INT (integer)
    Represents the SQL INTEGER data type.
PDO::PARAM_STR (integer)
    Represents the SQL CHAR, VARCHAR, or other string data type.
PDO::PARAM_LOB (integer)
    Represents the SQL large object data type.
Avatar billede arne_v Ekspert
09. september 2014 - 18:35 #5
Her er hvordan det ser ud i Java med JDBC:

PreparedStatement ins = con.prepareStatement("INSERT INTO t VALUES(?,?)");
for(int i = 0; i < 5; i++) {
    ins.setInt(1, v[i]);
    ins.setString(2, s[i]);
    ins.executeUpdate();
}

Og i C# med ADO.NET:

MySqlCommand ins = new MySqlCommand("INSERT INTO t VALUES(?v,?s)", con);
ins.Parameters.Add("?v", MySqlDbType.Int32);
ins.Parameters.Add("?s", MySqlDbType.VarChar, 50);
for(int i = 0; i < 5; i++)
{
    ins.Parameters["?v"].Value = v[i];
    ins.Parameters["?s"].Value = s[i];
    ins.ExecuteNonQuery();
}

Alle har type med.
Avatar billede bing89 Nybegynder
09. september 2014 - 18:49 #6
Når ja, det havde jeg faktisk glemt fra da jeg brugte mysqli (før du fortalte mig at der var noget der hed PDO).. Dengang kan jeg også huske at datatypen ikke påvirkede mit input..

Men tak for svarene og hjælpen. Du er velkommen til at smide et svar :)
Avatar billede arne_v Ekspert
10. september 2014 - 03:02 #7
svar
Avatar billede bing89 Nybegynder
11. september 2014 - 12:15 #8
Tak for visningen af Java - men jeg har mildt sagt INGEN forstand på Java (endnu) :)
Avatar billede arne_v Ekspert
12. september 2014 - 04:16 #9
Min pointe var bare at man ogsaa i andre sprog angiver type.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester