Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL - UPDATE

Sivun loppuun

janijohannes [27.04.2009 18:35:56]

#

Kun päivitän tietuetta, se luo uuden tietueen.
Käytän siis tälläistä pätkää:

<?php
mysql_query("UPDATE vieras_vastaus SET msg = '$msg', nimi = '$nimi' WHERE id = '$id'",$con);
?>

Toimii muuten, mutta sivuvaikutuksena uusi tietue jolla sama ID.

Antti Laaksonen [27.04.2009 18:42:21]

#

Onko jossain toisessa kohdassa koodissa INSERT-komento, joka suoritetaan myös?

janijohannes [27.04.2009 19:52:39]

#

No niinhän se oli.

Mutta nyt toinen kysymys: Ensimmmäiselle viestille tulee id 1 mutta kaikille sen jälkeen tulee id 2? Lisäksi ne tulostuu väärinpäin.

Koodi:

<?php
	$con=mysql_connect('localhost','***','***');
	mysql_select_db('***',$con);
	if (isset($_POST['nimi'])) {
		$id=$_GET['id'];
		$lt=htmlspecialchars($_POST['msg']);
		$lt=str_replace('ö','&ouml;',str_replace('ä','&auml;',$lt));
		$lt=str_replace('Ö','&Ouml;',str_replace('Ä','&Auml;',$lt));
		$lt=str_replace('Y','&#89;',str_replace('y','&#121;',$lt));
		$lt=str_replace('\n','<br />',$lt);
		mysql_query('INSERT INTO vieras_msg (nimi, msg, id) VALUES (\''.htmlspecialchars($_POST['nimi']).'\', \'$lt\', \'$id\')',$con);
		mysql_close($con);
		Header('Location: vieraskirja.php');
	}
	if (isset($_GET['edit'])) {
		if ($_COOKIE["verify"]=='***') {
			$id=$_GET['edit'];
			$h=mysql_query("SELECT msg, nimi FROM vieras_msg WHERE id = '".$id."'",$con);
			$msg=mysql_result($h,0,"msg");
			$nimi=mysql_result($h,0,"nimi");
			if (isset($_GET['ok'])) {
				if (isset($_GET['del'])) {
					mysql_query("DELETE FROM vieras_msg WHERE id = '".$id."'",$con);
					Header('Location: vieraskirja');
				}
				$msg=htmlspecialchars($_POST['msg']); $nimi=htmlspecialchars($_POST['nimi2']);
				$msg=str_replace('ö','&ouml;',str_replace('ä','&auml;',$msg));
				$msg=str_replace('Ö','&Ouml;',str_replace('Ä','&Auml;',$msg));
				$msg=str_replace('Y','&#89;',str_replace('y','&#121;',$msg));
				$msg=str_replace('\n','<br />',$msg);
				mysql_query("UPDATE vieras_msg SET msg = '$msg', nimi = '$nimi' WHERE id = '$id'",$con);
				Header('Location: vieraskirja');
			} else {
				?><form action='?edit=<?php echo $id; ?>&ok' method='post'>Nimi: <input type='text' name='nimi2' value='<?php echo $nimi; ?>' /><br />
				Viesti: <textarea rows='5' name='msg'><?php echo $msg; ?></textarea><input type='submit' value='OK' /></form>
				<br /><a href='?edit=<?php echo $id; ?>&ok&del'>Poista viesti</a><?php
				die();
			}
		}
	}
?>
...paljon koodia...
			<?php
				$lines=array();
				$h=mysql_query('SELECT * FROM vieras_msg',$con) or die('');
				for ($i=0; $i<mysql_num_rows($h); $i++) {
					$nimi=mysql_result($h,$i,"nimi");
					$msg=mysql_result($h,$i,"msg");
					$id=mysql_result($h,$i,"id");
					$lines[]='<pre class=sis>'.
					($_COOKIE["verify"]=='***' ? '<a href="?edit='.$id.'">Muokkaa</a><br />' : '').
					'<b>'.$nimi.'</b>:<br /><pre class=sis>'.$msg.'</pre></pre>'.($i!=0 ? '<hr />' : '<br />');
				}
				$lines=array_reverse($lines);
				foreach ($lines as $txt) echo $txt;
			?>
			<form action='?id=<?php echo ($id+1); ?>' method='post'>Nimi: <input type='text' name='nimi' /><br />
			Viesti: <textarea rows='5' name='msg'></textarea>
			<input type='submit' value='L&#228;het&#228;' /><form>
		</div>
	</body>
</html>
<?php mysql_close($con); ?>

temu92 [27.04.2009 19:57:34]

#

Jos et käytä semmosta ihmettä kuin auto_increment nii pistäppä päälle. PhpMyAdmin osaa sen ainakin laittaa helposti. Ja se siis tuolle id sarakkeelle.

janijohannes [27.04.2009 20:04:53]

#

temu92 kirjoitti:

Jos et käytä semmosta ihmettä kuin auto_increment nii pistäppä päälle. PhpMyAdmin osaa sen ainakin laittaa helposti. Ja se siis tuolle id sarakkeelle.

Hä-häh? Enpä ole hirmu.net:issä tommosista palveluista kuullu.

Teuro [27.04.2009 20:17:41]

#

phpmyadmin voi toki kuuluakin sivupakettiin, mutta voit aivan yhtä hyvin ladatakin sen. Ohjelma on varsin helppo konfiguroida, kun seuraa vain asennusohjeita tarkasti.

Tuo muuten rutkasti potkua tietokantojen käsittelyyn, jos vertaa palveluntarjoajan omia työkaluja.

janijohannes [27.04.2009 20:28:19]

#

Täytyy sanoa, että minulle tuo on siansaksaa.
Mutta olisiko se mahdollista tuolla minun tavallani?

Antti Laaksonen [27.04.2009 20:29:43]

#

janijohannes kirjoitti:

Ensimmmäiselle viestille tulee id 1 mutta kaikille sen jälkeen tulee id 2? Lisäksi ne tulostuu väärinpäin.

Koodistasi ei selviä, miten uuden rivin id-numero muodostetaan eli mistä tulee muuttuja $_GET['id'].

temu92 kirjoitti:

Jos et käytä semmosta ihmettä kuin auto_increment nii pistäppä päälle.

Siis jos id-kentän tyyppi on AUTO_INCREMENT, jokainen tauluun lisättävä rivi saa automaattisesti uuden id-numeron eikä tästä tarvitse huolehtia itse.

temu92 kirjoitti:

PhpMyAdmin osaa sen ainakin laittaa helposti.

Siis phpMyAdmin on yksi työkalu, jota voi käyttää tietokannan hallintaan. Jos käytät jotain muuta, siinäkin voi varmaan määrittää kentän tyypiksi AUTO_INCREMENT.

janijohannes [27.04.2009 20:33:30]

#

Antti Laaksonen kirjoitti:

janijohannes kirjoitti:

Ensimmmäiselle viestille tulee id 1 mutta kaikille sen jälkeen tulee id 2? Lisäksi ne tulostuu väärinpäin.

Koodistasi ei selviä, miten uuden rivin id-numero muodostetaan eli mistä tulee muuttuja $_GET['id'].

Kylläpä vain selviää.

$id=mysql_result($h,$i,"id");
...koodia...
<form action='?id=<?php echo ($id+1); ?>' method='post'>

Teuro [27.04.2009 20:41:21]

#

janijohannes kirjoitti:

Kylläpä vain selviää.

$id=mysql_result($h,$i,"id");
...koodia...
<form action='?id=<?php echo ($id+1); ?>' method='post'>

Tuota voiko lomakkeella lähettää samaan aikaan GET ja POST muuttujat? Minusta se ei pitäisi olla mahdollista. Muutenkin ehkä mielummin se id sitten vaikka hidden kentän kautta. Voisi olla varmempi jatkon kannalta?

janijohannes [27.04.2009 20:42:23]

#

Teuro kirjoitti:

janijohannes kirjoitti:

Kylläpä vain selviää.

$id=mysql_result($h,$i,"id");
...koodia...
<form action='?id=<?php echo ($id+1); ?>' method='post'>

Tuota voiko lomakkeella lähettää samaan aikaan GET ja POST muuttujat? Minusta se ei pitäisi olla mahdollista. Muutenkin ehkä mielummin se id sitten vaikka hidden kentän kautta. Voisi olla varmempi jatkon kannalta?

Voi lähettää. Ei jaksa.

Antti Laaksonen [27.04.2009 20:46:40]

#

Kiitos korjauksesta, en huomannut katsoa tuota koodin osaa.

Ensinnäkin viestit saa tulostumaan haluttuun järjestykseen lisäämällä SELECT-kyselyn perään ORDER BY -lajittelun.

Jos haluat vanhimman viestin ensin, kirjoita näin:

SELECT * FROM vieras_msg ORDER BY id

Jos haluat uusimman viestin ensin, kirjoita näin:

SELECT * FROM vieras_msg ORDER BY id DESC

Jos uusi id-numero on aina 2, ($id+1) on aina 2 eli $id on aina 1. Muuttuja $id saa uuden arvon joka for-silmukan kierroksella ja viimeinen arvo jää voimaan. Jos viestit näytetään vanhimmasta uusimpaan, tässä ei ole ongelmaa. Muussa tapauksessa muuttujan $id arvo voi olla väärin, siis jotain muuta kuin suurin id-numero. Yksi korjaus on ottaa käyttöön ylimääräinen muuttuja, jossa pidetään kirjaa suurimmasta id-numerosta.

Mutta AUTO_INCREMENT ei ole välttämättä huono idea: mitä tapahtuu, jos kaksi henkilöä lataa sivun samaan aikaan ja molemmat saavat saman uuden id-numeron?

janijohannes [27.04.2009 21:16:56]

#

Antti Laaksonen kirjoitti:

Mutta AUTO_INCREMENT ei ole välttämättä huono idea: mitä tapahtuu, jos kaksi henkilöä lataa sivun samaan aikaan ja molemmat saavat saman uuden id-numeron?

Mutta miten tätä "AUTO_INCREMENT"-juttua käytetään?

Metabolix [27.04.2009 22:34:59]

#

Mitään id-numeroa ei missään tapauksessa pidä asettaa käsin — tuossahan on törmäysriski, jos kaksi käyttäjää on kirjoittamassa samaan aikaan.

Kun luot taulun, sinun täytyy lisätä id:n tietoihin AUTO_INCREMENT.

CREATE TABLE viesti (
  id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  teksti TEXT
);

Jos taulu on jo luotu etkä voi tuhota sitä ja luoda uudestaan, voit tietenkin lisätä AUTO_INCREMENTin myös jälkikäteen:

ALTER TABLE viesti CHANGE COLUMN id id INTEGER UNSIGNED AUTO_INCREMENT;

Kun sitten lisäät tauluun viestejä, et aseta itse id-kenttää, vaan tietokanta ottaa aina uuden numeron.

<?php
# lisätään rivi
$t = mysql_real_escape_string($t, $yhteys);
mysql_query("INSERT INTO viesti SET teksti = '$t'", $yhteys);
# selvitetään sille osunut id
$id = mysql_insert_id($yhteys);
?>

janijohannes [28.04.2009 13:22:29]

#

Selvä.

Laitanko sitten kyselyksi

INSERT INTO vieras_msg (nimi, msg) VALUES ('$nimi', '$msg')

?

Metabolix [28.04.2009 14:31:45]

#

Esimerkiksi noin.

janijohannes [28.04.2009 16:12:11]

#

Ei toimi.

id saa aina arvon ''.

Metabolix [28.04.2009 16:52:33]

#

Oletko nyt varmasti luonut taulun oikein? Onhan id-kentän tyyppi kokonaisluku?

Mitä seuraava MySQL-kysely tulostaa? (Käytä jotain ohjelmaa tai PHP-viritystä, jolla voit suorittaa kyselyitä suoraan ja saat nätit tulokset.)

DESCRIBE viesti;

Esimerkkitaulullani MySQL-asiakasohjelmani tulostaa näin:

mysql> DESCRIBE viesti;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| teksti | text             | YES  |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

janijohannes [28.04.2009 17:10:53]

#

Ja mistä sellainen ohjelma?

Grez [28.04.2009 17:19:03]

#

No esim MySQLin mukana tulee...

janijohannes [28.04.2009 17:21:36]

#

Grez kirjoitti:

No esim MySQLin mukana tulee...

No kun kyseessä ei ole oma palvelin -.-

Grez [28.04.2009 17:25:14]

#

No voihan sen silti ladata sieltä MySQL:n sivuilta omalle koneellekin.

Tai sitten hakee ihan graafiset työkalut, esim http://dev.mysql.com/downloads/gui-tools/5.0.html

janijohannes [28.04.2009 17:33:44]

#

Nuo jo latasin, mutta ei ne toimi.

jo123 [28.04.2009 20:25:08]

#

janijohannes kirjoitti:

Nuo jo latasin, mutta ei ne toimi.

Toimii, jos käytät oikein.

janijohannes [28.04.2009 20:27:05]

#

Eli?

jo123 [28.04.2009 20:34:29]

#

Öö. lopun voit opetella itse. On nimittäin hyödyllinen taito osata hallita kantoja ja itseopiskeltuna oppi tuppaa jäädä päähän parhaiten.

janijohannes [28.04.2009 20:41:48]

#

Mjoo-o. Ainoa ongelma on että hirmu.net:tiin ei sillä saa yhteyttä.

Milo [28.04.2009 20:54:14]

#

Voit huviksesi asentaa omalle koneelle MySQL-palvelimen ja MySQL-asiakasohjelmalla kokeilla omat CREATE, INSERT, SELECT, UPDATE ja DELETE -lauseet.

janijohannes [30.04.2009 17:19:30]

#

Syy löytyi, kiitos IRC:in.
MetaBolixin id asetettiin väärin.

MetaBolix:

ALTER TABLE viesti CHANGE COLUMN id id INTEGER UNSIGNED AUTO_INCREMENT;

IRC-tyyppi:

ALTER TABLE table_name CHANGE COLUMN id id INTEGER AUTO_INCREMENT UNIQUE KEY

TeNDoLLA [30.04.2009 18:14:35]

#

Eikös tuo id ole aina uniikki kun se kasvaa aina siitä mihin viimesin jäi vaikka välistä poistettas entryjä aina kun se on määritetty auto_incrementiksi. Sitten kun määritetään vielä key (primary tai unique), niin kenttä indeksoidaan ja haut sen kentän perusteella nopeutuu. Lisäksi unique key:ssä ei voi olla duplikaatteja mutta siinä vissiin voi silti olla useita NULL arvoja toisin kuin primary keyssä. Lisäksi tuota primary keytä käytetään yleensä taulujen välisissä suhteissa (child-parent).

Näistä taas en ole ihan 100% varma, mutta korjailkoon ne ken paremmin tietää.


Sivun alkuun

Vastaus

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

Tietoa sivustosta