Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SQL-virhe "near 'read = 1 ..."

Sivun loppuun

Rocceri [03.07.2009 15:24:02]

#

Saan nykyään ihan päättömiä erroreita. Esimerkkinä on nyt tullut "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read = 1 WHERE id = 2' at line 1". Kyselyni näyttää tältä:

UPDATE viestit SET read = 1 WHERE id = $id

En ymmärrä mikä tässä on vialla, mielestäni tässä ei ole mitään vikaa.

<?php
if($user) {
$ky = mysql_query("SELECT * FROM viestit WHERE id = '".$_GET["id"]."'") or die(mysql_error());
$to = mysql_fetch_array($ky);
echo "<br>";
if($user["id"] == $to["vastaanottaja_id"]) {
	$id = $_GET["id"];
	mysql_query("UPDATE viestit SET read = 1 WHERE id = $id");


	echo "<tr><td><div style=\"float: left\">Otsikko: ".$to["otsikko"]." | Lähettäjä: ".$to["lahettaja"]." [".date("d.m.Y H:i:s", $to["aika"])."]</div>
	<div style=\"float: right\"><a href=\"index.php?sivu=lahetaviesti&vastaus=".
$to["lahettaja"]."&vl=".$to["otsikko"]."\">Vastaa</a></div><br><hr>".
$to["viesti"]."</td></tr>";
}
} else die();
?>

Chiman [03.07.2009 15:55:45]

#

read ja id ovat numerotyyppiä? int tms. Pastea vaikka taulumäärittely: show create table viestit.

Ja php-mysql:n vakiovirhe sinulla myös: sijoitat käyttäjän syötteen suoraan tietokantakyselyyn. Käytä vaikka intval()-funktiota välissä putsaamaan pois muut kuin kokonaisluvut.

Select-lauseessa sinulla on heittomerkit id:n ympärillä. Poista ne.

Rocceri [03.07.2009 16:10:56]

#

id|lahettaja|lahettaja_id|vastaanottaja|vastaaottaja_id|otsikko|viesti|aika|read

Tuolta näyttää taulu viestit. Osaisiko joku sanoa, mikä tuossa UPDATE kyselyssä on väärin? En näe siinä vieläkään mitään väärää. :S

Smuliii [03.07.2009 16:24:22]

#

Numeroissa käytetään '-merkkejä, jos en täysin väärin muista.

Rocceri [03.07.2009 16:27:36]

#

Taitaapi olla kuules juuri toisin päin ;)

Chiman [03.07.2009 16:34:47]

#

Rocceri kirjoitti:

id|lahettaja|lahettaja_id|vastaanottaja|vastaaottaja_id|otsikko|viesti|aika|read

Tuolta näyttää taulu viestit.

Tuossa lukee vastaaottaja, n puuttuu, mutta se lienee vain typo viestissäsi.

Kenttien nimet eivät yksin kiinnostaneet, vaan myös niiden tyypit, jotka eivät tuosta näy. Tarkista että id ja read ovat kokonaislukuja.

Kannattaa myös tulostaa se kyselylauseke, esim. näin (lisäsin myös intvalin):

$id = intval($_GET["id"]);
$sql = "UPDATE viestit SET read = 1 WHERE id = $id";
echo "sql: '{$sql}'\n";
mysql_query($sql);

TeNDoLLA [03.07.2009 16:37:19]

#

Smuliii kirjoitti:

Numeroissa käytetään '-merkkejä, jos en täysin väärin muista.

Numeroissa just ei käytetä, vaan stringeissä käytetään.

Rocceri [03.07.2009 16:41:33]

#

Chiman kirjoitti:

Tuossa lukee vastaaottaja, n puuttuu

Kun käsin kirjotin, niin tuli kirjoitusvirhe ;)

Chiman kirjoitti:

Kenttien nimet eivät yksin kiinnostaneet, vaan myös niiden tyypit, jotka eivät tuosta näy.

INT, TEXT, INT, TEXT, INT, TEXT, TEXT, INT, INT vasemmalta oikealle. Numerot on kaikki INT ja muu teksti TEXT.

Chiman kirjoitti:

$id = intval($_GET["id"]);
$sql = "UPDATE viestit SET read = 1 WHERE id = $id";
echo "sql: '{$sql}'\n";
mysql_query($sql);

Samaa erroria tuppaa tulemaan.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read = 1 WHERE id = 2' at line 1

TeNDoLLA [03.07.2009 16:54:14]

#

Ei tuossa kyllä ole mitään vikaa ainakaan äkkiseltään huomaa. Ootko kokeillu ajaa kyselyä suoraan jostain sql komento ohjelmasta (kuten sqlyog, heidisql tai mysql komentorivi) toimiiko se siellä yleensäkää millään arvoilla?

Rocceri [03.07.2009 16:57:04]

#

TeNDoLLA kirjoitti:

Ei tuossa kyllä ole mitään vikaa ainakaan äkkiseltään huomaa. Ootko kokeillu ajaa kyselyä suoraan jostain sql komento ohjelmasta (kuten sqlyog, heidisql tai mysql komentorivi) toimiiko se siellä yleensäkää millään arvoilla?

PhpMyAdmin palauttaa saman arvon, niinkuin kaikki muutkin.
Kyselyni lakkasivat toimimasta, kun aloin tallentamaan tiedostot UTF-8 koodauksella. :/ Vain pieni osa toimii.

TeNDoLLA [03.07.2009 18:01:58]

#

En kyllä tiedä tähän hätään eikä ehdi perehtyyn enempää nytten, mutta varmin tapa saada toimiin on, että jokapaikassa on samat character setit. Http-meta tagit, php headereissä, kannan taulut/kanta ja tiedostot.

Voit kattoa mikä setti sulla on kannassa vaikka näin php:lta käsin

<?php
$test = mysql_query("SHOW VARIABLES LIKE 'ch%';");
var_dump(mysql_fetch_array($test));
?>

Voit myös koittaa laittaa tämän heti yhteyden muodostuksen perään

<?php
mysql_query("SET NAMES utf8");
?>

Ja täältä lisäinfoa:
http://dev.mysql.com/doc/refman/5.1/en/charset.html

GimPeltzi [03.07.2009 18:20:49]

#

Kyselyyn puolipiste?

Chiman [03.07.2009 18:55:01]

#

Rocceri kirjoitti:

Chiman kirjoitti:

$id = intval($_GET["id"]);
$sql = "UPDATE viestit SET read = 1 WHERE id = $id";
echo "sql: '{$sql}'\n";
mysql_query($sql);

Samaa erroria tuppaa tulemaan.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read = 1 WHERE id = 2' at line 1

Tottakai sama virhe tuli, mutta millaisen sql-lauseen tuo echo-kohta tulosti? Laitoin sen debug-tulostukseksi, jotta näkee koko lauseen sellaisena kuin se meni, eikä vain osaa siitä.

GimPeltzi: puolipistettä ei tule noihin.

Muoks: Kirjoita vaikka tuon kyselyn välilyönnit uusiksi siltä varalta, että olisit laittanut siihen johonkin jotain muuta kuin tavallisen spacen.

Lebe80 [03.07.2009 19:01:04]

#

onkos read varattu nimi?

Chiman [03.07.2009 19:02:45]

#

Lebe80 sen keksi :) http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html

tämä toiminee:

mysql_query("UPDATE viestit SET `read` = 1 WHERE id = $id");

Rocceri [05.07.2009 13:01:10]

#

Kyllä, tämä toimii hienosti ;)
Kiitos teille avusta. Yksi kysymys vielä, toimiiko tämä `` tyyli vaikka se ei olisi varattu nimi? Eli kaikki voisi olla `taulu` tyylillä?

Grez [05.07.2009 13:16:19]

#

Juu, kaikki kenttien ja taulujen nimet voi MySQL:ssä laittaa ``-merkkien väliin.

Oraclessa ja PostgreSQL:ssä vastaavasti "Nimi"
MSSQL:ssä [Nimi]

Rocceri [05.07.2009 13:37:27]

#

Selvä, kiitos. Toivottavasti tämä auttaa myöhemmin muuallakin :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta