PHP > Mysql_query.. 2st frågor

Permalänk
Medlem

PHP > Mysql_query.. 2st frågor

Jag håller på att följa lite böcker och exempel på internet och hittils går det bra men

Första frågan: jag hittar inte på php.net vad ASC betyder.
I ett exempel

<?php $query = "SELECT * FROM database ORDER BY position ASC" ?>

Andra frågan.

Varför funkar denna koden.

<?php query = mysql_query("SELECT * FROM sidor WHERE menu_id = {$menu["id"]}", $connect); while($page = mysql_fetch_array($query)){ echo $page['menu']; } ?>

Men inte denna?

<?php $query = "SELECT * FROM sidor WHERE menu_id = {$menu["id"]}"; $result = mysql_query($query, $connect); while($page = mysql_fetch_array($result)){ echo $page['menu']; } ?>

Error vid "WHERE menu_id ="

Jag tycker det borde funka lika bra som första, men tydligen inte och jag undrar varför?

Visa signatur

Samsung 34'' ultrawide curved
Logitech MX master & Logitech g910
Creative SoundBlaster Katana

Permalänk

asc står för ascending dvs stigande. så har du nummerna 1-9 så kommer 1 vara först och 9 sist eller om du har a-z så sorterar den via bokstavsordning

Permalänk
Medlem

Och så borde du använda dig av prepared statements för ökad säkerhet, mysqli eller PDO!

Permalänk
Medlem
Skrivet av downup:

<?php query = mysql_query("SELECT * FROM sidor WHERE menu_id = {$menu["id"]}", $connect); while($page = mysql_fetch_array($query)){ echo $page['menu']; } ?>

Men inte denna?

<?php $query = "SELECT * FROM sidor WHERE menu_id = {$menu["id"]}"; $result = mysql_query($query, $connect); while($page = mysql_fetch_array($result)){ echo $page['menu']; } ?>

Error vid "WHERE menu_id ="

Jag tycker det borde funka lika bra som första, men tydligen inte och jag undrar varför?

pröva tabort {} från den andra koden.
så det blir
$query = "SELECT * FROM sidor WHERE menu_id = ".$menu["id"];

Visa signatur

citera gärna så jag hittar tillbaka!

Permalänk
Medlem

Som ovan skriver så använder sig php punkter för att avskilja strings från variabler, exempel:

$namn = "Simowewe"; $mening = "Hej jag heter " . $namn; $fras = "vad heter du?"; $mening2 = "Hej jag heter " . $namn . ", " . $fras; echo $mening; // Hej jag heter Simowewe echo $mening2; // Hej jag heter Simowewe, vad heter du?

Permalänk
Medlem
Skrivet av Gardart:

pröva tabort {} från den andra koden.
så det blir
$query = "SELECT * FROM sidor WHERE menu_id = ".$menu["id"];

Skrivet av simowewe:

Som ovan skriver så använder sig php punkter för att avskilja strings från variabler, exempel [kod]...

Det är inget svar på frågan och jag är också lite nyfiken nu. Som de flesta PHP-utvecklare borde veta expanderas variabelnamn i strängar mellan dubbelcitationstecken, t ex echo "Hello $world";
Om det första exemplet verkligen fungerar visar det på inkonsekvent stränghantering.

Du kan testa att skriva "...{$menu['id']}..." istället, dvs byta till enkla citationstecken inuti strängen. Det andra borde egentligen inte fungera alls.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av simowewe:

Som ovan skriver så använder sig php punkter för att avskilja strings från variabler...

Klammerparenteser används för att man skall slippa konkatenering. Exempelvis så kan

$kontaktinfo = "Namn: " . $kund->fornamn . " " . $kund->efternamn . " Address: " . $kund->gatuaddress . ", " . $kund->postnr . ", " . $kund->postort;

skrivas

$kontaktinfo = "Namn: {$kund->fornamn} {$kund->efternamn} Address: {$kund->gatuaddress}, {$kund->postnr}, {$kund->postort}";

vilket är klart mer lättläst.

Skrivet av Teknocide:

Som de flesta PHP-utvecklare borde veta expanderas variabelnamn i strängar mellan dubbelcitationstecken, t ex echo "Hello $world";
Om det första exemplet verkligen fungerar visar det på inkonsekvent stränghantering.

Enligt PHP-manualen kan uttryck inom klammerparenteser i en sträng skrivas precis som de skrivs utanför strängar. Om (har inte testat) det funkar med dubbla citationstecken så beror det troligtvis på att interpolationen utförs före resten av strängen hanteras.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av simowewe:

Och så borde du använda dig av prepared statements för ökad säkerhet, mysqli eller PDO!

Han behöver inte ge sig in i PDO och finlira innan han kan grunderna för hur SQL fungerar.

Visa signatur

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.

Permalänk
Medlem

Snicksnack, är det bättre att han skriver kod öppen för SQL injections istället menar du?

Att lära sig använda prepared statements är en del av att lära sig grunderna i hur man använder SQL.

Visa signatur

Mina boktips: Clean codeHead First Design PatternsHead First Object-oriented Analysis and Design
Innovation distinguishes between a leader and a follower. — Steve Jobs

Permalänk
Medlem
Skrivet av BlueEyes:

Han behöver inte ge sig in i PDO och finlira innan han kan grunderna för hur SQL fungerar.

Det är ju inte direkt så att det är någon större skillnad i själva mysql-frågan, man kan ju lika gärna lära sig mysqli eller PDO från början? Inte direkt svårare, bara säkrare!

Permalänk
Skrivet av downup:

Jag håller på att följa lite böcker och exempel på internet och hittils går det bra men
Varför funkar denna koden.

<?php query = mysql_query("SELECT * FROM sidor WHERE menu_id = {$menu["id"]}", $connect); while($page = mysql_fetch_array($query)){ echo $page['menu']; } ?>

Men inte denna?

<?php $query = "SELECT * FROM sidor WHERE menu_id = {$menu["id"]}"; $result = mysql_query($query, $connect); while($page = mysql_fetch_array($result)){ echo $page['menu']; } ?>

Error vid "WHERE menu_id ="

Jag tycker det borde funka lika bra som första, men tydligen inte och jag undrar varför?

Skulle vilja säga att det är betydligt konstigare att den första koden fungerar. Dels har du glömt $ framför query och dels gör du mysql_fetch_array($query) istället för på $result, som det måste vara. I andra kodexemplet ser dock allting rätt ut, men av någon anledning är $menu['id'] tomt. Gör en print_r($menu) innan och dubbelkolla vad det innehåller. Kanske har du ändrat något annat i din kod också mellan testen?

För övrigt så rekommenderar jag dels att sätta enkelcitat runt värden i sql-queries:
$query = "SELECT * FROM sidor WHERE menu_id = '{$menu['id']}'";

Samt att alltid kontrollera data du får in från användaren genom $_GET eller $_POST med mysql_real_esacpe_string():
http://php.net/manual/en/function.mysql-real-escape-string.ph...

Permalänk
Skrivet av DrRotmos:

Snicksnack, är det bättre att han skriver kod öppen för SQL injections istället menar du?

Att lära sig använda prepared statements är en del av att lära sig grunderna i hur man använder SQL.

Snick-snack själv, prepared statements är långt ifrån nödvändigt när man jobbar med php/mysql. Ser man bara till att kontrollera all in-data ordentligt räcker det långt. Jobbar själv med storskalig utveckling av onlinespel och vi klarar oss väldigt fint utan några prepared statements.

Permalänk
Medlem
Skrivet av infinity08:

Skulle vilja säga att det är betydligt konstigare att den första koden fungerar. Dels har du glömt $ framför query och dels gör du mysql_fetch_array($query) istället för på $result, som det måste vara.

Det första kodexemplet innehåller ingen $result, så det vore dumt att försöka köra mysql_fetch_array med den som parameter (dock hade $result varit ett mer passande namn än $query då variabeln innehåller just resultatet och inte frågan).

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem

Hade 10 minuter över, så jag testade din kod. Förutom det saknade $-tecknet i det första kodstycket så hittar jag inget fel; även den kod du säger inte fungerar visade sig fungera bra för mig. Dock så rekommenderar jag, precis som de flesta andra här, att du använder enkla citationstecken istället för dubbla när du refererar till ett namngivet index).

Min testkod:

<?php /* DB structure: TABLE: sidor FIELDS: menu_id (INT(10)), menu (VARCHAR(50)) DATA: (1,menu1), (2,menu2), (3,menu3), (4,menu4) */ // Connect to mySQL $connect = mysql_connect('localhost', 'root', ''); // Yep, High Security if (!$connect) { die('Could not connect: ' . mysql_error()); } // Select which database to use $db = mysql_select_db('TestDB', $connect); if (!$db) { die ('Error selecting DB: ' . mysql_error()); } // Variable used to test the code $menu["id"] = 3; // Expected test code output will be "menu3", see DATA above // Test code part I $query = mysql_query("SELECT * FROM sidor WHERE menu_id = {$menu["id"]}", $connect); // $query = Result from an sql-query while($page = mysql_fetch_array($query)){ echo $page['menu']; } // Test code part II $query = "SELECT * FROM sidor WHERE menu_id = {$menu["id"]}"; // $query = String with input for an sql-query $result = mysql_query($query, $connect); // $result = Result from an sql-query while($page = mysql_fetch_array($result)){ echo $page['menu']; } ?>

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Skrivet av PeCe:

Det första kodexemplet innehåller ingen $result, så det vore dumt att försöka köra mysql_fetch_array med den som parameter (dock hade $result varit ett mer passande namn än $query då variabeln innehåller just resultatet och inte frågan).

Ah, du har rätt, läste lite för snabbt

Permalänk
Hedersmedlem
Skrivet av infinity08:

Snick-snack själv, prepared statements är långt ifrån nödvändigt när man jobbar med php/mysql. Ser man bara till att kontrollera all in-data ordentligt räcker det långt. Jobbar själv med storskalig utveckling av onlinespel och vi klarar oss väldigt fint utan några prepared statements.

I PHP-manualen står det att det starkt rekommenderas att använda mysqli framför mysql av ett par olika anledningar. Dels är det säkrare, då en överhängande del av alla PHP-säkerhetshål kommer från SQL-injektion, vilket händer även på sidor där folk tycker att de har kontrollerat indata tillräckligt. Dels är det en ordentligt hastighetsboost i vissa fall, och aldrig en hastighetsförlust. Dels ger det ett mer strukturerat sätt att jobba mot databasen. Dels stöder mysql inte multipla statements. (Att det förenklar byte av databas är ett ytterligare argument, men det är i praktiken inget man gör utan större insatser ändå om man sköter en större sida.)

Utöver detta kan nämnas att mysql inte längre aktivt utvecklas, och därmed inte stöder nyheter i MySQL (och så har varit fallet sedan PHP 4.1.3 eller något).

Det är en första tröskel att använda prepared statements, men på en timme eller så bör man vara helt införstådd, och därefter kan man hitta effektiviseringar.

På _mindre_ sidor klarar man sig utan prepared statements. På större sidor, när prestanda börjar komma in i bilden, så bör man ha gjort rätt från början. Jag är inte emot att man lär sig använda mysql till en början om det gör att man får en lättare väg in i PHP, men det är en av de stora anledningarna till PHP:s dåliga säkerhetsrykte.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Skrivet av phz:

I PHP-manualen står det att det starkt rekommenderas att använda mysqli framför mysql av ett par olika anledningar. Dels är det säkrare, då en överhängande del av alla PHP-säkerhetshål kommer från SQL-injektion, vilket händer även på sidor där folk tycker att de har kontrollerat indata tillräckligt. Dels är det en ordentligt hastighetsboost i vissa fall, och aldrig en hastighetsförlust. Dels ger det ett mer strukturerat sätt att jobba mot databasen. Dels stöder mysql inte multipla statements. (Att det förenklar byte av databas är ett ytterligare argument, men det är i praktiken inget man gör utan större insatser ändå om man sköter en större sida.)

Utöver detta kan nämnas att mysql inte längre aktivt utvecklas, och därmed inte stöder nyheter i MySQL (och så har varit fallet sedan PHP 4.1.3 eller något).

Det är en första tröskel att använda prepared statements, men på en timme eller så bör man vara helt införstådd, och därefter kan man hitta effektiviseringar.

På _mindre_ sidor klarar man sig utan prepared statements. På större sidor, när prestanda börjar komma in i bilden, så bör man ha gjort rätt från början. Jag är inte emot att man lär sig använda mysql till en början om det gör att man får en lättare väg in i PHP, men det är en av de stora anledningarna till PHP:s dåliga säkerhetsrykte.

Absolut, finns ingen anledning att inte använda mysqli, det är inte krångligare än klassisk mysql på något sätt och tillför en mängd förbättringar. Det är prepared statements jag vänder mig emot, som nybörjare finns det ingen poäng i att grotta ner sig i det. Har kört en del tester i våra applikationer med prepared statements, och rent prestandamässigt var det ingen förbättring. Säkrare ja, men skriver man sina sql-frågor på rätt sätt är det minst lika säkert.

Permalänk
Medlem

Självklart bör man satsa på prepared statements om applikationen man skriver skall användas i skarpt läge.

Dock tror jag att det är en bra idé att lära sig skriva säker kod genom att börja med osäker kod och steg för steg förbättra den. Man får ju ingen djupare förståelse för problemet om man bara gör som någon på ett nätforum säger, praktisk erfarenhet är en betydligt bättre läromästare.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Hedersmedlem
Skrivet av infinity08:

Absolut, finns ingen anledning att inte använda mysqli, det är inte krångligare än klassisk mysql på något sätt och tillför en mängd förbättringar. Det är prepared statements jag vänder mig emot, som nybörjare finns det ingen poäng i att grotta ner sig i det. Har kört en del tester i våra applikationer med prepared statements, och rent prestandamässigt var det ingen förbättring. Säkrare ja, men skriver man sina sql-frågor på rätt sätt är det minst lika säkert.

Eventuell prestandaförbättring beror givet på vilka anrop man behöver göra, men jag har sett rent av direkt upplevda hastighetsförbättringar (inte bara ~ms som syns i mätapplikationer) med prepared statements i vissa, fortfarande enkla, fall. Det beror mycket på hur CPU/IO-begränsad man är på databasservern: om IO begränsar tillräckligt mycket så kommer prestandavinsten bara märkas i att man får fler lediga CPU-cykler som inte används.

Från http://stackoverflow.com/questions/687550/preparedstatements-... (bra tråd i ämnet):

Citat:

If you're not using PrepardStatements and have no fear of SQL injection attacks, then you don't know enough about SQL injection attacks.

Citat:

So as a reason for using prepared statements, the protection against SQL injection attacks far outweighs the performance improvement. And if you're not worried about SQL injection attacks, you probably should be.

Citat:

However even if the performance were identical you should still use prepared statements to prevent SQL Injection. At my company this is an interview question; get it wrong and we might not hire you.

Jag håller starkt med om att det är klurigare att sätta sig in i prepared statements. Att PHP är så vida spritt är just för att det är så rackarns enkelt att som nybörjare skriva en applikation med databasanrop (det var därför jag satte mig in i PHP), så om mysqli med prepared statements vore obligatoriskt så hade säkert en enorm mängd användare försvunnit. Dock är det ju just nybörjare som hade fått invärdeskontroll "på köpet", vilket hade säkrat upp stora delar av internet, rent ut sagt. (Det _ersätter_ inte invärdeskontroll i alla fall, men det täpper igen många oönskade hål.)

Skrivet av PeCe:

Självklart bör man satsa på prepared statements om applikationen man skriver skall användas i skarpt läge.

Dock tror jag att det är en bra idé att lära sig skriva säker kod genom att börja med osäker kod och steg för steg förbättra den. Man får ju ingen djupare förståelse för problemet om man bara gör som någon på ett nätforum säger, praktisk erfarenhet är en betydligt bättre läromästare.

Också medhåll. Genom att hålla inkörströskeln låg så är det mycket större chans att man fortsätter hålla intresset, och att börja böka med jobbigare koncept redan i "hello world"-stadiet kan vara oöverkomligt för nya användare.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.