Ik wil een zoekopdracht uitvoeren die zoekt op kleine en hoofdletters en nummers gemengd door elkaar heen. Bv. als je 'z1AfJ90z100826' of 'a1AfJ90Z100826' als zoekopdracht verzend en in de de database staat 'S1AfJ90Z100826' dan krijg ik geen resultaat maar alleen als ik op 'S1AfJ90Z100826' zoek

Ik heb dit staan:
<?
$SQL="select * from inkoopfactuurdetails where ";
$SQL=$SQL."productserienr = '".$snr."' or productserienr = '".$snr2."'";
?>

maar ook dit geprobeerd uit phpmyadmin wat werkt als ik daar zoek maar niet als ik het in mijn script doet

<?
$SQL = 'SELECT * FROM `inkoopfactuurdetails` WHERE `productserienr` LIKE CONVERT(_utf8 '".$snr."' USING latin1) COLLATE latin1_swedish_ci';

?>
NOOIT shorttags gebruiken !
MySQL code is in hoofdletters!
Ook gehoord van beveiliging?


<?php
$SQL="SELECT * FROM inkoopfactuurdetails WHERE ";
  $SQL=$SQL."productserienr = '".mysql_real_escape_string($snr)."' OR productserienr = '".mysql_real_escape_string($snr2)."'";
?>
mysql_real_escape_string haalt speciale karakters weg maar die staan er ook soms in en er moet gezocht worden op alles maar niet uitmaken of je kleine of hoofdletters typt en deze worden ook allebei in de database door elkaar heen gebruikt?

PS wel gehoord van beveiliging maar heb er niet zo veel verstand van, wat kan ik daaraan doen?
Dennis Ham op 06/08/2010 19:36:31

mysql_real_escape_string haalt speciale karakters weg


Waar haal je dat vandaan?
SanThe Nvt op 06/08/2010 19:42:38

[quote="Dennis Ham op 06/08/2010 19:36:31"]
mysql_real_escape_string haalt speciale karakters weg


Waar haal je dat vandaan?

[/quote]
mysql_real_escape_string haalt quotes weg ( ' of " )
[php]mysql_real_escape_string[/php] haalt niet speciale karakters weg, want dat zou je input slopen. Je wilt je input houden zoals je het krijgt. Het zorgt er dus alleen voor dat het wel in je database komt zonder dat je fouten in je queries krijgt (sql injections, of gewoon fouten).
Omdat je WHERE gebruikt, moet de data overeen komen. Als het goed is zou het met LIKE moeten willen. Zie docs, de query: SELECT 'a' LIKE 'A' levert 1 dus is gelijk.

Raoul Blabla op 06/08/2010 19:46:01

[quote="SanThe Nvt op 06/08/2010 19:42:38"]
[quote="Dennis Ham op 06/08/2010 19:36:31"]
mysql_real_escape_string haalt speciale karakters weg


Waar haal je dat vandaan?

[/quote]
mysql_real_escape_string haalt quotes weg ( ' of " )

[/quote]

Godver, lees. [php]mysql_real_ESCAPE_string[/php].
Als het weg zou halen dan zou het wel mysql_remove_shit zijn.
En bovendien escapte het ook nog andere karakters die mogelijk ongeldige queries kunnen opleveren.
Haha ik heb dit gelezen mysql_real_escape_string — Escapes special characters in a string for use in an SQL statement. Beetje verkeerd begrepen van het engels.

Ik heb nu dit staan:
<?
$SQL=$SQL."productserienr LIKE '".mysql_real_escape_string($snr)."' OR productserienr LIKE '".mysql_real_escape_string($snr2)."'";
?>

als ik zoek op 'S1AFJ90Z100826' lukt het maar verander ik de eerste letter in een kleine letter bv 's1AFJ90Z100826' dan krijg ik geen resultaat.
Raoul Blabla op 06/08/2010 19:27:08

MySQL code is in hoofdletters!

Je reinste onzin, je mag het door elkaar gebruiken. Waar komt die onzin toch steeds weer vandaan ? Dat het wellicht nettter staat is een keuze maar het het hoeft niet. Laatst riep iemand dat een equi join ook niet meer mocht en dat een inner join sneller is, ook een broodje aap.

Voor wat betreft het probleem is de simpelste oplossing om tijdens de zoekactie even te Upper Casen: where upper(productserienr) = upper('s1afJ90Z100826'). Overigens is dat dan wel weer een dure (trage) zoekactie omdat je door deze syntax geen index-pad krijgt. Meestal heb je daar met kleine mysql databeesjes geen last van. Om toch via een index te zoeken heb je een functional index nodig en ik weet niet of mysql dat ondersteunt. create index op de upper(veldnaam) om het even eenvoudig te zeggen.

Eventueel gewoon alle productserienrs in upper case opslaan en daar een index op bouwen bespaart je de functie: where upper(productserienr) en kan je gewoon doen where productserienr = upper($snr)
Bij de insert dus la werken met upper($snr)
Dat gaat helaas niet werken want de database is al gevuld met 3 jaar serienummers in kleine- en hoofdletters en een combinatie daarvan.

PS of de MySqL code groot of klein is maakt mij niet zo veel uit als het maar werkt :P
dan is je oplossing om tijdens de zoekactie te uppercasen en dat werkt absoluut, probeer maar:
SELECT * FROM inkoopfactuurdetails WHERE upper(productserienr) = upper($snr);
Dan wordt tijdens de zoekactie even ge-upper-cased terwijl je resultaat gewoon blijft zoals je het ingevoerd hebt. Alle letters worden alleen tijdens het zoeken upper case vergeleken!
Als ik dat doe krijg ik:
Fatal error: Call to undefined function upper() in *** on line 40

ik heb dit staan:
<?
$SQL=$SQL."upper(productserienr) = '".upper($snr)."' OR productserienr = '".upper($snr2)."'";
?>

Reageren