Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL ääkköset ja rivien haku

Macro [28.11.2010 18:13:37]

#

Terve

Nyt ei ole kyse siitä normaalista ongelmasta, että MySQL-kannan ääkköset ovat päin puuta, vaan toisenlaisesta asiasta.

Minulla on dataa taulussa, ja haen sitä vertailemalla sarakkeita nimi ja valmistaja. En keskenään, mutta käyttäjän syöttämään tavaraan.

Taulukko näyttää tältä (+ paljon lisää samanlaisia rivejä)

nimivalmistaja
Kulkuri Premium-citypyöräHELKAMA

Haen sitä näin tietokannasta.

$kysely = mysql_query("SELECT * FROM pyorat WHERE LOWER(valmistaja) = '" . mysql_real_escape_string(mb_strtolower($v)) . "' AND LOWER(nimi) = '" . mysql_real_escape_string(mb_strtolower($m)) . "'") or die(mysql_error());

Kysely palauttaa nolla riviä, vaikka tieto löytyy samanlaisena tietokannasta. Mistä kiikastaa?


Tälläisen virheen sain, kun asetin MySQL-yhteyden charsetiksi utf8 mysql_set_charset funktiolla. Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
Virhe ei tule suoraan siitä mysql_set_charset funktiosta, vaan tuo tulee tuosta ylempänä olevasta kyselystä. Yllä olevilla tiedoilla sitä ei kumminkaan tule, vaan se tulee vain osalla. Kaikki ovat ihan selkokielistä tekstiä ja sisältävät skandinaavisia merkkejä.

Taulussa on myös sarake sx, joka kertoo onko rivin pyörä naisten, miesten, lapsien, poikien vai tyttöjen pyörä, vai onko se kaikille eli "tyhjä". Koska samoja pyöriä on naisille ja miehille erillaisena samalla nimellä, niin tulee kaksi palautusta tietokannasta tuolla kyselyllä. Se pitäisi pystyä rajaamaan vielä tuon sx-sarakkeen mukaan verrattuna sx-muuttujaan.

Macro [29.11.2010 11:49:58]

#

Kyselyyn liittyvän ongelman ratkaisin, eli nyt se palauttaa tavaraa. Sivustoni on UTF-8 muodossa, ja tietokanta oli jossain muussa. Tietokannan merkistöongelma ei vaikuttanut kumminkaan asiaan, vaikka muutin sarakkeet utf8_unicode_ci:ksi. Nyt en myöskään tarvitse mysql_set_charset-funktiota. Se, ettei niitä löytynyt, johtui mb_strtolower-funktiosta. Se palautti tiedon jossain muussa merkistössä kuin UTF-8:na. Lisäämällä sille toisen parametrin , utf8, niin tietoa löytyi jo.

Edit. Tyhmä minä. Miksi aloin kuljettamaan tuotteiden nimiä ja muita tietoja osoitteen mukana, kun olisin voinut laittaa sinne id-numeron ja kantaan myös...


Aloitusviestin ongelmat ovat siis ratkaistu. Vielä yksi kysymys.

Minulla on pääkäyttäjänä root, jolla on aivan kaikki oikeudet. Ajattelin lisätä vähän tietoturvaa, ja loin toisen käyttäjän jolle annoi vain luvat käyttää kyselyissä SELECTiä, INSERTtiä, UPDATEa ja DELETEä. Käyttäjälle ei ole annettu mitään ns. resurssirajoituksia, eli saa olla monta yhteyttä päällä ja ei ole mitään siirtorajoja. Kyselyissä käytän vain noita neljää komentoa. Mistä johtuu, että tämä käyttäjä hidastelee ja tosi paljon? Dataa ei tule kannasta kuin ensimmäiset kaksi saraketta, ja sitten PHP antaa ilmoituksen ylittyneestä aikarajasta.

Macro [29.11.2010 13:43:53]

#

Ei se hitaus johdukkaan tuosta tunnuksesta tms... Testasin eri tunnuksilla omalla palvelimella ja sitten servut.us:lla. Joka kerta saan virheen, että maksimi suoritusaika 30s on käytetty.

Viitsisikö joku katsoa tätä koodia, ja kertoa missä vuotaa?

<?php
$yhteys = mysql_connect("x", "x", "x");
mysql_select_db("x");

$id = isset($_GET["id"]) && is_numeric($_GET["id"]) ? mysql_real_escape_string($_GET["id"]) : die("ID needed");

// MYSQL-haku
$kysely = mysql_query("SELECT * FROM pyorat WHERE id = '$id'") or die(mysql_error());
if(mysql_num_rows($kysely) == 1) {
	$tiedot = mysql_fetch_assoc($kysely);

	$data = array(); $datat = array();
	foreach($tiedot as $sarake => $arvo) {
                // Koska taulukon ensimmäiseen soluun $taulu["jotain"] ei voi viitata $taulu[0]. mysql_fetch_array palauttaisi molemmat. $taulu[0] ja $taulu["jotain"]
		$data[] = array($sarake, $arvo);
		$datat[$sarake] = $arvo;
	}
} else {
	echo "Virhe! Rivejä " . mysql_num_rows($kysely);
}
?>

<h2 style="text-align: center"></h2>
<table border="1" align="center">
	<?php
	echo "<tr>\n";
	for($i = 0; $i < sizeof($data) - 2; $i++) {
		if($i == 3) {
			$i--;
			continue;
		}

		if($i % 3 == 0) {
			echo "</tr>\n";
			if(sizeof($data) - $i > 1)
				echo "<tr>";
		}

		echo "<td width=\"33%\" valign=\"top\">{$i}. <b>" . ucfirst(utf8_encode($data[$i][0])) . ":</b> " . utf8_encode($data[$i][1]) . "</td>\n";
	}
	echo "</tr>"
	?>
</table>
<?php echo "<p style=\"text-align: center\">" . utf8_encode($datat["muuta"]) . "</p>"; ?>
<p style="text-align: center">
	<b>Hinta: <?php echo $datat["hinta"]; ?></b><br />
    <a href="pyorat/" rel="lightbox" title="">Katso kuva</a>
</p>

<?php mysql_close($yhteys); ?>

Edit. Mainio yhdistelmä tuo $i == 3 ja for-looppi jossa kasvatetaan $i:tä 12 asti... :D Nyt se sitten sattuu toimimaan.

Vastaus

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

Tietoa sivustosta