Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL ja taulukon otsikkolinkit

Sivun loppuun

peg [31.01.2007 01:11:13]

#

eli onko joku helppo / näppärä tapa tulostaa mysql taulusta sarakkeet
järjestettynä sen mukaan mitä otsikkoa klikkaa. Eli jos on Otsikot/sarakkeet
A B C niin klikkaamalla B sarakkeet järjestyy b:n mukaan jne jne.

Tinqe [31.01.2007 01:29:45]

#

SELECT juttu,toinen FROM taulu ORDER BY b

PHP/MySQL-opas

peg [31.01.2007 09:28:19]

#

Joo, mutta toi linkki sivulla, pitääkö tehdä sivu a, sivu b ja sivu c.
Vai onko joku helpompi tapa järjestää tiedot.

Damiqib [31.01.2007 09:39:06]

#

Tähän tyyliin onnistunee:

Linkkiin: ?sivu=juttu&order=b

SELECT juttu,toinen FROM taulu ORDER BY $_GET['order']

Agony [31.01.2007 10:11:51]

#

hngrhfffypllrrts... Edellä mainittu teksti oli tarkoitettu kuvaamaan ylläpitäjän kommenttia joka tukehtuu kahviin ja pullaan saman aikaisesti kun huomaa että yksinkertaisella SQL-Exploitilla on täytetty tietokanta Cialis- ja muilla pippelinpidennyslinkeillä.

$order = mysql_real_escape_string(stripslashes($_GET['order']));

Minimissään.

ajv [31.01.2007 10:20:33]

#

Ja ei käyttäjälle tartte kertoa sen tietokannan sarakkeiden nimiä.

MySQL ymmärtää
ORDER BY 1 // ensimmäisen sarakkeen mukaan
ORDER BY 2 // toisen sarakkeen mukaan
jne...

?sivu=juttu&sort=1&order=ASC
?sivu=juttu&sort=1&order=DESC
?sivu=juttu&sort=2&order=ASC
?sivu=juttu&sort=2&order=DESC

<?php
$order = isset($_GET['order']) && $_GET['order'] == 'DESC') ? 'DESC' ?:'ASC';
$sort = isset($_GET['sort']) && is_numeric($_GET['sort']) ? intval($_GET['sort']) : 1;

$sql = "SELECT foo FROM bar ORDER BY {$sort} {$order}";
?>

Edit. bugit koodissa

Opiskelija [31.01.2007 14:14:25]

#

ajv kirjoitti:

Ja ei käyttäjälle tartte kertoa sen tietokannan sarakkeiden nimiä.

?sivu=juttu&sort=1&order=ASC
...
$sql = "SELECT foo FROM bar ORDER BY {$sort} {$order}";

No juu sit kun taulurakenne muuttuu niin tuleepi ongelmia joten kannattaa käyttää sarakkeiden nimiä kyselyssä. Sekä linkkien on hyvä olla kuvaavia vaikka siinä ei sarakkeen nimeä olisikaan.

Tinqe [01.02.2007 00:03:49]

#

Offtopic: MySQL-lauseeseen sisälle muuttujat pystyy lisäämään laittamalla ne yksinkertaisesti {$muuttuja} tyylillä? Itselläni kun on ollut mitä ihmeellisempiä hipsuvirityksiä, toimivia mutta eivät järin järkevän näköisiä koodin keskellä.

GoldenDragon [01.02.2007 11:19:35]

#

Otetaan vaikka tuosta ajv:n koodista esimerkki.
Siis jos tuolla tavalla lisäät, niin lisäät aivan tavallisen merkkijonon, johon voi sisällyttää muuttujia (Olettaen, että käytetään lainausmerkkejä, ""). Eikä ees noista aaltosulkeita tarvitse käyttää, ellei vaarana ole, että muuttujat tai muu merkkijono sotkeudu toisiinsa.
Tämä toimii:

$sql = "SELECT foo FROM bar ORDER BY {$sort} {$order}";

Niinkuin tämäkin:

$sql = "SELECT foo FROM bar ORDER BY $sort $order";

Tässä esimerkki, milloin tarvitsee käyttää aaltosulkeita:

$nimi = "Jari";
$merkkijono = "{$nimi}n auto on punainen.";

Eli muuttuja sekoittuisi muuten muuhun tekstiin, jos aaltosulkeita ei käytetä (tässä tapauksessa kirjaimeen n). PHP-tulkki vain antaisi virheilmoituksen tuntemattomasta muuttujasta $nimin.
Virhe:

$nimi = "Jari";
$merkkijono = "$nimin auto on punainen.";

peg [05.02.2007 15:35:57]

#

Saan otsikot näin, mutta nyt noi vielä linkeiksi niin että klikkaamalla
otsikkoa sisältö järjestykseen sarakkeen mukaan.

$dbname = 'kalen';
$db_selected = mysql_select_db($dbname, $link);
if (!$db_selected) {
   die("Could not set $dbname: " . mysql_error());
}
$res = mysql_query('select * from uutiset', $link);

echo "<hr>" . mysql_field_name($res, 0) . "\n<br>";
echo mysql_field_name($res, 1) . "\n<br>";
echo mysql_field_name($res, 2) . "\n<br>";
echo mysql_field_name($res, 3) . "\n<br>";
echo mysql_field_name($res, 4) . "\n<hr>";

LaNu [06.02.2007 20:12:12]

#

peg kirjoitti:

Saan otsikot näin, mutta nyt noi vielä linkeiksi niin että klikkaamalla
otsikkoa sisältö järjestykseen sarakkeen mukaan.

peg kirjoitti:

echo "<hr>" . mysql_field_name($res, 0) . "\n<br>";
echo mysql_field_name($res, 1) . "\n<br>";
echo mysql_field_name($res, 2) . "\n<br>";
echo mysql_field_name($res, 3) . "\n<br>";
echo mysql_field_name($res, 4) . "\n<hr>";

Eikö taulukon otsikot pitäisi olla <thead>-tagien sisällä (ja se varsinainen sisältö tbodyssa)?

<table>
	<thead>
	<!-- otsikkorivi ja otsikot omiin soluihinsa -->
	</thead>
	<tbody>
	<!-- varsinainen taulukon sisältö -->
	</tbody>
</table>

Solun tekstistä voi tehdä ihan normaalin linkin. Tuolla jo aiemmin on neuvottu, että minkä tyyppinen sen linkin pitää olla ja miten sen avulla saadaan kyselyn tulokset järjestettyä.

peg [27.02.2007 21:41:34]

#

en ole saanut tätä toimimaan vieläkään, voisko joku jeesata?
eli valittaa tosta

<?php
$order = isset

$yhteys = mysql_connect($server, $user, $pass) or die("Virhe kytkettäessä tietokantaan!");
mysql_select_db($database,$yhteys) or die("Virhe valittaessa tietokantaa!");

// Yhdistäminen mysql kantaan suoritettu, sitten itse asiaan


echo "<html><body>";
echo "<form method='POST' action='send.php'>

<pre>
Lähettäjä:   <input type='text' name='sender' size='40'>
Otsikko:     <input type='text' name='otsikko'  size='40'>
uutinen:     <input type='text' name='uutinen' size='40'>
</pre>
  <input type='submit' value=' Lisää linkki ' target='_self' name='B1'>
  <input type='reset' value='Tyhjennä' name='B2'>
</p>

</form>";




//haetaan kaikki tavarat
$kysely = "SELECT * FROM uutiset ORDER BY {$sort} {$order}";// ORDER BY 4 ASC";
//suoritetaan kysely
$haku = mysql_query($kysely, $yhteys) or die("Virhe kyselyssä!");

echo "<table border>";
echo "<tr><td><b>id</b></td><td><b>sender</b></td><td><b>uutinen</b></td>
<td><b>otsikko</b></td><td><b>aika</b></td></tr>";
//käydään tavarat läpi
for ($i = 0; $i < mysql_num_rows($haku); $i++) {
   //haetaan nimi, hinta ja määrä muuttujiin
   $id = mysql_result($haku, $i, "id");
   $sender = mysql_result($haku, $i, "sender");
   $uutinen = mysql_result($haku, $i, "uutinen");
   $otsikko = mysql_result($haku, $i, "otsikko");
   $aika = mysql_result($haku, $i, "aika");
   //tulostetaan taulukon rivi
   echo "<tr><td>$id</td><td>$sender</td><td>$uutinen</td>
<td>$otsikko</td><td>$aika</td></tr>";
}
echo "</table>";

echo "</body></html>";


//header("Location: http://62.44.217.75/uutinen.php");
if(isset($submit)) {

//$aika = time();
mysql_query("INSERT INTO uutiset (sender,uutinen,aika,otsikko) VALUES ('$sender','$uutinen','$aika','$otsikko')") or die("Lisäys ei onnistunut!". mysql_error());
}


echo "<form method='POST' action='send.php'>

<pre>
Lähettäjä:   <input type='text' name='sender' size='40'>
Otsikko:     <input type='text' name='otsikko'  size='40'>
uutinen:     <input type='text' name='uutinen' size='40'>
</pre>
  <input type='submit' value=' Lisää linkki ' target='_self' name='B1'>
  <input type='reset' value='Tyhjennä' name='B2'>
</p>

</form>";
$order = isset($_GET['order']) && $_GET['order'] == 'DESC') : 'DESC' ? 'ASC';
$sort = isset($_GET['sort']) && is_numeric($_GET['sort']) : intval($_GET['sort']) ? 1;
$remote=getenv("REMOTE_ADDR");
echo ($remote);
echo ("<a href=\"uutinen.php?id=uutiset&sort=2&order=ASC\">uutinen</a>");

mysql_close($yhteys);
?>

tsuriga [28.02.2007 00:49:20]

#

ylimäärästä sulkua yms. yms. hanki kunnon editori. Kaksoispiste ja kysymysmerkki toistepäin, ternary operation (hirveät nuo php.netin linkit)

ajv [28.02.2007 06:50:26]

#

tsuriga kirjoitti:

Kaksoispiste ja kysymysmerkki toistepäin, ternary operation (hirveät nuo php.netin linkit)

Hups, mun moka...

$order = isset($_GET['order']) && $_GET['order'] == 'DESC') ? 'DESC' : 'ASC';

Tietenkin tosiaan noin päin...

peg [28.02.2007 12:24:34]

#

En saa edelleenkään toimimaan, sivu tulostuu, mutta järjestyksen muuttuminen
ei pelaa. http://62.44.217.249/harkat/uutinen.php Antakee neuvoja jos keksitte
vian, koodi on myös sivulla.

ajv [28.02.2007 13:15:58]

#

Tulosta se SQL-lause ja mieti mikä siinä on pielessä.

peg [28.02.2007 16:08:58]

#

tarkoititko siis tätä.

$sql = 'SELECT * FROM `uutiset` ORDER BY `uutiset` . `id` ASC ';

ajv [28.02.2007 18:03:10]

#

En, vaan sitä $kysely-muuttujaa, jonka sisällön nyt tuolla sivulla oletkin tulostanut:

SELECT * FROM uutiset ORDER BY "$order".

Arvaatko mikä on vikana?

peg [28.02.2007 19:53:52]

#

Luultavasti, mutta ainoa tulostus joka menee läpi, hipsut tai sulkeet antaa errorin. Noi {} vaikka tossa joku antoi ymmärtää että niitä voisi käyttää.

ajv [01.03.2007 08:04:21]

#

SELECT * FROM uutiset ORDER BY "$order"

on ihan yhtä pätevä seuraavan SQL-lauseen kanssa:

SELECT * FROM uutiset ORDER BY "kuukerin nelli"

Eli vinkki-vitonen: oikea syntaksi olisi esim:

...ORDER BY 1

Eli kotitehtäväksi jää, miten saat tuolta osoiteriviltä sarakkeen numeron ympättyä tuohon SQL-lauseeseen.

Toinen vinkki vielä: mitkä olikaan hipsujen ja lainausmerkkien erot PHP:ssä?

En periaatteestakaan anna suoraa vastausta, koska aikaisemmissa esimerkeissä on jo selkeästi esitetty miten koodin pitäisi toimia.

peg [01.03.2007 15:38:05]

#

Älä anna, mutta selitä vielä lisää, olen ihan pihalla...
{$order} sentään jo toimii.

Lebe80 [01.03.2007 16:03:05]

#

echo "kysely alkaa tästä:++++".$kysely."++++ ja loppuu tähän, pastee se Putkaan, jookojooko";

{$order}:n "toimimisella" tuskin on yhtään sen enempää hyötyä, jos kaikki muu on pielessä.

ja pastee se plusmerkkien välinen rimpsu siis tänne...

peg [01.03.2007 16:35:18]

#

Kivakiva, viikkosit asensinmyslin janytkaikki pitää muailotyttönä...

ajv [01.03.2007 17:01:17]

#

Tuossa tuo aikaisempi vastaus korjattuna:

<?php
//jos osoiteriviltä on annettu parametrit, käytetään niitä, muuten oletuksena $order on ASC ja $sort 1
$order = isset($_GET['order']) && $_GET['order'] == 'DESC') ? 'DESC' :'ASC';
$sort = isset($_GET['sort']) && is_numeric($_GET['sort']) ? intval($_GET['sort']) : 1;

//käytetään lainausmerkkejä eikä hipsuja, jolloin merkkijono parsitaan muuttujien varalta. Ei lainausmerkkejä ORDER BY-komentoon.
$kysely = "SELECT foo FROM bar ORDER BY {$sort} {$order}";
echo $kysely."<br />";
$haku = mysql_query($kysely, $yhteys) or die("Virhe kyselyssä!");

//jne.. tulostukset ja muut sulla toimikin jo.

?>

Tuolla pitäisi minun käsittääkseni toimia. Ja linkit menevät:

uutinen.php?sort=1&order=ASC
uutinen.php?sort=1&order=DESC
uutinen.php?sort=2&order=ASC
uutinen.php?sort=2&order=DESC

peg [02.03.2007 16:27:00]

#

No niin, juuri kun luulin päässeeni jyvälle niin ei. Nimittäin
LIMIT ei pelitä, se asetetaan jotenkin toisin vai?
esim. http://62.44.217.249/harkat/uutinen.php

ajv [02.03.2007 16:32:54]

#

Samalla periaatteella se LIMITinkin ymppääminen SQL-lauseeseen toimii, mutta sitähän nyt ei yleensä käyttäjän tarvitse antaa osoiteriviltä. Vai oletko kenties tekemässä tuohon sivutusta?

peg [02.03.2007 16:39:48]

#

Kunhan opettelen, mutta periaate sellaiselle toiminnalle että tulostetaan
kannasta 0-30 sitten 31-60 jne..

ajv [02.03.2007 17:02:54]

#

Tuo sivutus koodivinkki on silloin apunasi.

peg [02.03.2007 19:00:03]

#

En paljoa muuttanut tuota alkuperäistä sivutuskoodia, mutta pikku
bugi sivulla 24 vain muutama rivi ja tulostaa silti sivulle 25
linkin joka on tyhjä.
http://62.44.217.249/harkat/sukusi.php


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta