[PHP/MySQL] MIN('-1', '-2') = '-1'?*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

ik ben bezig met stukje php incl. MySQL database.
De database ziet er als volgt uit:
code:
1
2
3
4
tabel: taal_tekst
TT_id  text                  
TA_taalcode  varchar(5)                   
tekst  longtext

De TT_id i.c.m. de TA_taalcode is een unieke sleutel, dit omdat het een meertalig systeem is, in deze tabel staan alle woorden en zinnen in alle talen.
Het id zal in alle talen dus gelijk zijn, dit kan zowel een getal zijn, als een woord.
Ik wil hier items aan toevoegen met een uniek TT_id.
Omdat er ook woorden in staan krijg ik het woord 'wijzigen' als resultaat van deze querie:
PHP:
1
$maxQ = "SELECT MAX(TT_id) FROM taal_tekst;";


als ik het volgende doe:
PHP:
1
$minQ = "SELECT MIN(TT_id) FROM taal_tekst;";

Neemt hij in plaat van '-2' de waarde '-1', hoe kan dit?
Ook als ik de waarde verlaag en insert krijg ik als ik deze querie opnieuw aanroep weer '-1'.

Mijn vraag bestaat eigenlijk uit twee delen:
waarom krijg ik '-1' i.p.v. '-2'?
En hoe kan ik het grootste getal selecteren om vervolgens deze te verhogen.
Het is geen autoincrement omdat het een textveld is en omdat ik voor alle taalcodes hetzelfde id nodig heb.

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

Waarom wil je het minimum van een tekstveld hebben? :?

Wil je met getallen werken, definieer een kolom dan ook als een getal en maak MySQL niet wijs dat het een tekst is.

[ Voor 3% gewijzigd door gorgi_19 op 31-10-2005 17:07 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar kan ik de tekst die er nu in staat dan nog wel gewoon gebruiken?
En omdat de MAX niet werkte, dacht ik over te stappen op de MIN, maar dat heeft jammer genoeg dus ook niet het gewenste resultaat.
Omdat je in MySQL/PHP evenveel omhoog als naar beneden kan maakt het toch niet zoveel uit wat je als TT-id gebruikt toch?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Alfabetisch gezien is de string '-1' kleiner dan de string '-2'. Daarom is '-1' kleiner dan '-2', in tegenstelling tot -1 en -2.

Je doet gewoon veel te gekke dingen. Een id is een unieke identifier, en je bent fout bezig als die twee verschillende datatypen moet kunnen hebben. Maak van je ID een getal, of laat het een string en accepteer dat het sorteren en dergelijke wat lastiger wordt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

MAX() op een string werkt prima. Let op dat '2' groter is dan '1000', en 'z' groter is dan 'a'.

Als je specifiek op getallen wilt maxxen, dan kan je een vieze hack gebruiken en iets doen als MAX(TO_INT(veld)) gebruiken, maar raad ik je niet aan. Dat gaat onherroepelijk een keer fout als je toch een lettertje in de kolom hebt staan.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Is het mogelijk om er een INT veld van te maken en de 'tekst'-id's erin te laten staan?
Want voor de leesbaarheid van de code is het wel beter dat de 'tekst'-ids blijven bestaan.

Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 14:31
Nee, dat is logischerwijs niet mogelijk.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Zoek eens een goede tutorial over database normalisatie en kolomtypes. Ik denk dat dat al hoop ophelderd, en toekomstige problemen kan verhelpen.

Acties:
  • 0 Henk 'm!

  • Boogie
  • Registratie: Januari 2001
  • Laatst online: 06-11-2024
>Is het mogelijk om er een INT veld van te maken en de 'tekst'-id's erin te laten staan?
Wat je natuurlijk kan doen is even auto-increment kolom erbij maken, vervolgens via een scriptje je autoincrement getallen en je text-id's ophalen en in een tijdelijke tabel inserten.
Vervolgens pas je je tabel aan naar 'int' (verwijder string kolom en voeg int kolom toe) en kan je aan de hand van je auto-increment je getallenwaarden van je oude stings weer op de juiste plaats terug zettten.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het probleem reeds opgelost door er een INT-veld van te maken, ik ben nu helaas mijn 'tekst'-id's kwijt, de leesbaarheid van de code (voornamelijk voor de interface) is nu veel minder.

Ook zal ik nu meerdere scripts doormoeten om alles weer aan te passen, maar iig, het werkt nu weer goed.

Bedankt voor alle tips / adviezen.

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Verwijderd schreef op dinsdag 01 november 2005 @ 08:35:
Is het mogelijk om er een INT veld van te maken en de 'tekst'-id's erin te laten staan?
Want voor de leesbaarheid van de code is het wel beter dat de 'tekst'-ids blijven bestaan.
Nee dat is het helemaal niet :)

Je mag geen database ID's in je code rond hebben slingeren. Dergelijke magic numbers zijn een grote nono. Als je die ID's in je code moet gebruiken zul je ze dus op moeten halen. Danwel uit de DB, danwel uit een config bestand.

Ik heb een tijdje bij een webdesignbedrijfje gewerkt waar ik hun CMS op mocht schonen. Kwam continue dit soort code tegen:

code:
1
2
3
4
5
6
7
8
9
if($item_id == 316753)
{
    DoSomethingReallyOdd();
    return;
}
else
{
    ProcessItem();
}


En dat soort zut kwam je overal tegen. Schoon je de DB op (items hadden sub items, maar die persoon had er niet aan gedacht dat als je een item verwijdert het misschien ook wel een idee is de sub items te verwijderen), doet opeens de site het niet meer omdat dat '316753' item op de hoofdpagina gebruikt moet worden om de config te laden ofzo.

[ Voor 67% gewijzigd door Hydra op 01-11-2005 14:43 ]

https://niels.nu

Pagina: 1