Query voorkomt in databse
heb een hele kleine vraag (alweer) :P,
nou.. ben ik niet zow goed met mysql gedoe.. :(
ik heb nu een plan die ik uit wil werken maar dat ik zeg maar niet weet hoe ik het aan moet pakken, omdat ik niet echt precies weet hoe mysql werkt.
(het gaat om mijn ster scriptje, stelt een poll voor)
nu heb ik dit wel
sql = "
INSERT INTO fictieve_tabel
(
id,
cijfer,
ip
)
VALUES
(
'".$nummer."',
'".$cijfer."',
'".$_SERVER['REMOTE_ADDR']."'
)
";
mijn probleem zit vormalig niet in hoe ik het in mijn database moet schrijven of lezen maar hoe ik het alles moet controleren
nu kun je bij mijn poll script allemaal id's maken elke id niet meer dan 1 dezelfde ip adres hebben. spreekt voor zich.
alleen weet ik niet hoe ik dit moet doen?
vet vaag, moet ik een for maken en dat ie zeg maar alles controlleert?
Edit: ik zit het trouwens te leren met blanche's site ^^ vet handig :P
http://phphulp.jorendewit.nl/view/41/3/
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender
en cijfer is de aantal procenten die je geeft.
gaat trouwens om dit ding
http://phphulp123.freehostia.com/ster.html
uit de bron kun je dit opmaken
<div id="sterUser[/b]" class="user">50%</div>
dus in dit geval is id=0
en cijfer = 50
nu wil ik dit dat mensen kunnen stemmen maar niet meerdere malen per id...
ps. Dan kan elk ip adres dus maar 1x op een bepaalde poll stemmen. Maar besef dat meerdere gebruikers van hetzelfde ip-adres gebruik kunnen maken...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
wil je me miss een handje helpe? ik vat nix van mysql
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if ($_GET['mooiester'] == "ster"){ $nummer = $_GET['nummer']; $cijfer = $_GET['cijfer'];
if (ctype_digit($nummer) And ctype_digit($cijfer)) {
if($cijfer >= "0" And $cijfer <= "100") {
$sql = "
INSERT INTO fictieve_tabel
(
id,
cijfer,
ip
)
VALUES
(
'".$nummer."',
'".$cijfer."',
'".$_SERVER['REMOTE_ADDR']."'
)
";
if(!$res = mysql_query($sql)) {
echo "Error";
} else {
echo "ok";
}
...
...
if (ctype_digit($nummer) And ctype_digit($cijfer)) {
if($cijfer >= "0" And $cijfer <= "100") {
$sql = "
INSERT INTO fictieve_tabel
(
id,
cijfer,
ip
)
VALUES
(
'".$nummer."',
'".$cijfer."',
'".$_SERVER['REMOTE_ADDR']."'
)
";
if(!$res = mysql_query($sql)) {
echo "Error";
} else {
echo "ok";
}
...
...
ik heb tot nu toe dit, waar moet ik unique constraint of zo toevoegen dan?
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender
Quote:
ps. Dan kan elk ip adres dus maar 1x op een bepaalde poll stemmen. Maar besef dat meerdere gebruikers van hetzelfde ip-adres gebruik kunnen maken...
Dan hebben ze pech :P, hoe moet ik het dan aanpakken?
Quote:
Staat allemaal in diezelfde handleiding uitgelegd: http://phphulp.jorendewit.nl/view/41/13/
Dat is hoofdstuk 13 en ik ging net over naar hoofdstuk 3 :).
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
ALTER TABLE
werknemers
ADD
FOREIGN KEY(functie_id)
REFERENCES functies (id)
ON DELETE RESTRICT
ON UPDATE CASCADE
werknemers
ADD
FOREIGN KEY(functie_id)
REFERENCES functies (id)
ON DELETE RESTRICT
ON UPDATE CASCADE
en van dat code snap ik er ook helemaaal nix van... mysql lijkt wel een eigen wereldje te hebbe :S... en ik d8 dat mysql niet eens zow moeilijk was.
Als je er zo'n moeite mee hebt, kun je inderdaad beter even de gehele handleiding doorlezen. Anders moet je misschien wat minder moeilijk beginnen? :)
Zoals Djemo al zegt, SQL is een taal op zich. Het staat verder dan ook helemaal los van PHP...
ik check eerst of de ip adres in mijn database voorkomt
als ie voorkomt check ik de id.. als de id gelijk is voegt ie het niet toe
en dat moet wel lukken denk ik..
makkelijker dan cascade of zow.. weet nog steeds niet wat het is :S
En dat heeft niks met PHP te maken.
Toch is het net engels:
ALTER TABLE : aanpassen van de tabel
ADD : toevoegen
FOREIGN KEY: vreemde sleutel
REFERENCES: referenties
ON DELETE: bij verwijderen
ON UPDATE: bij bijwerken
RESTRICT: beperken
CASCADE: waterval effect (kan het niet beter uitleggen)
Peter schreef op 30.01.2008 20:35:
Waarom al die controles? Een UNIQUE-constraint op de combinatie van ip-adres en id is meer dan genoeg. De query zal keurig mislukken wanneer iemand nogmaals een record met hetzelfde id en hetzelfde ip-adres wil toevoegen. Dat is de enige veilige manier, dit is waterdicht.weet je wat, ik pak mijn probleem moeilijker aan...
ik check eerst of de ip adres in mijn database voorkomt
als ie voorkomt check ik de id.. als de id gelijk is voegt ie het niet toe
en dat moet wel lukken denk ik..
makkelijker dan cascade of zow.. weet nog steeds niet wat het is :S
ik check eerst of de ip adres in mijn database voorkomt
als ie voorkomt check ik de id.. als de id gelijk is voegt ie het niet toe
en dat moet wel lukken denk ik..
makkelijker dan cascade of zow.. weet nog steeds niet wat het is :S
Wat CASCADE hier mee te maken heeft, is mij volkomen onduidelijk. Ik kan geen enkel verband leggen, slaat als een tang op een varken.
want nu wordt het echt onduidelijk, en ik weet ook niet meer naar wie ik moet luisteren :)
kun je misschien een beetje code toetse?
ik probeer daarna wel zelf te begrijpen hoe het in elkaar zit..
Moet er nu even vandoor, zal straks wel even wat SQL uitwerken. Mocht je nog geen oplossing hebben...
(sql != mysql... hmm)
Maar goed, de SQL om een index op meerdere kolommen aan te brengen ziet er zo uit:
En vervolgens zou je het invoegen dan op zo'n manier aan kunnen pakken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
$sQuery = "
INSERT INTO tabel
(
id,
ip
)
VALUES
(
".$id.",
'".$ip."
)
";
if(!$rResult = mysql_query($sQuery))
{
if(mysql_errno() == 1062)
{
echo 'Je hebt al een keer gestemmd op deze poll';
}
else
{
trigger_error(mysql_error().'<br />In query: '.$sQuery);
}
}
else
{
echo 'Je hebt gestemd';
}
?>
$sQuery = "
INSERT INTO tabel
(
id,
ip
)
VALUES
(
".$id.",
'".$ip."
)
";
if(!$rResult = mysql_query($sQuery))
{
if(mysql_errno() == 1062)
{
echo 'Je hebt al een keer gestemmd op deze poll';
}
else
{
trigger_error(mysql_error().'<br />In query: '.$sQuery);
}
}
else
{
echo 'Je hebt gestemd';
}
?>
owkee ik vat het nu wel een beetje meer
@blanche, alleen hoe weet je dat het 1062 is?
if(mysql_errno() == 1062)
Zie wederom de handleiding, daar staat foutnummer 1062 ook uitgelegd.
Dat is het foutnummer dat MySQL terug geeft als er een unique constraint violation opgetreden is. Dus als er geprobeerd is om dubbele waarden in te voeren...
RTFM ;)
Helaas geeft MySQL niet aan wélke UNIQUE-constraint is overtreden. Mocht je er meerdere in je tabel hebben staan, kun je daar alleen naar raden. In PostgreSQL krijg je ook de naam van de constraint retour, mits je bij het aanmaken van de constraint een naam hebt opgegeven. Da's logisch.
Helaas geeft MySQL niet aan wélke UNIQUE-constraint is overtreden. Mocht je er meerdere in je tabel hebben staan, kun je daar alleen naar raden. In PostgreSQL krijg je ook de naam van de constraint retour, mits je bij het aanmaken van de constraint een naam hebt opgegeven. Da's logisch.
id = text
cijfer = text
en
ip = text
ik heb text gekozen omdat ik bij de andere een cijfer moest invullen of zow, een goed argument heb ik dus ^^.
nu weet ik echt niet waar ik dit moet toevoegen: ALTER TABLE ster ADD UNIQUE (id, cijfer, ip)
moet ik het in sql doen?
als ik dat doe krijg ik een error
SQL-query:
ALTER TABLE ster ADD UNIQUE (
id,
cijfer,
ip
)
MySQL retourneerde: Documentatie
#1170 - BLOB/TEXT column 'id' used in key specification without a key length
hmm..?
edit: ik hoop trouwens niet dat ik jullie erger...
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender