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.
Onko jossain toisessa kohdassa koodissa INSERT-komento, joka suoritetaan myös?
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('ö','ö',str_replace('ä','ä',$lt)); $lt=str_replace('Ö','Ö',str_replace('Ä','Ä',$lt)); $lt=str_replace('Y','Y',str_replace('y','y',$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('ö','ö',str_replace('ä','ä',$msg)); $msg=str_replace('Ö','Ö',str_replace('Ä','Ä',$msg)); $msg=str_replace('Y','Y',str_replace('y','y',$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ähetä' /><form> </div> </body> </html> <?php mysql_close($con); ?>
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.
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.
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.
Täytyy sanoa, että minulle tuo on siansaksaa.
Mutta olisiko se mahdollista tuolla minun tavallani?
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.
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'>
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?
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.
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?
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?
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); ?>
Selvä.
Laitanko sitten kyselyksi
INSERT INTO vieras_msg (nimi, msg) VALUES ('$nimi', '$msg')
?
Esimerkiksi noin.
Ei toimi.
id saa aina arvon ''.
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)
Ja mistä sellainen ohjelma?
No esim MySQLin mukana tulee...
Grez kirjoitti:
No esim MySQLin mukana tulee...
No kun kyseessä ei ole oma palvelin -.-
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
Nuo jo latasin, mutta ei ne toimi.
janijohannes kirjoitti:
Nuo jo latasin, mutta ei ne toimi.
Toimii, jos käytät oikein.
Eli?
Öö. lopun voit opetella itse. On nimittäin hyödyllinen taito osata hallita kantoja ja itseopiskeltuna oppi tuppaa jäädä päähän parhaiten.
Mjoo-o. Ainoa ongelma on että hirmu.net:tiin ei sillä saa yhteyttä.
Voit huviksesi asentaa omalle koneelle MySQL-palvelimen ja MySQL-asiakasohjelmalla kokeilla omat CREATE, INSERT, SELECT, UPDATE ja DELETE -lauseet.
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
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ää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.