Problem PHP MySQL

Započeo maxogm, 16.04.2008, 18:20

prethodna tema - sledeća tema

maxogm

16.04.2008, 18:20 Poslednja Izmena: 16.04.2008, 22:02 od maxogm
Pozdrav, čuo sam od prijatelja da na ovom forumu postoji par ljudi koji rade programiranje u php-u...  ;D

Naime imam jedan problem:
Pravio sam neku pretragu u php-u, pretražuje se samo mysql baza. Problem je u tome što recimo u bazi je upisano: Holodoc, a korisnik unese da traži: holodoc. Rezultat je nema pronađenih stvari.
Ja sam u cilju rešenja problema napravio jedan konvertor, takav da šta god ste uneli vrši pretvaranje u velika slova:
npr uneli ste: markogm izlaz je MARKOGM, ustvari pošto konvertor pretvara i u ćirilicu izlaz je: МАРКОГМ

Mislio sam da ono što korisnik unese pretvorim u velika slova i uporedim sa nekim poljem iz baze čiji je sadržaj pretvoren u velika slova, međutim ne znam kako da napišem upit koji će primenom ove moje finkcije da pretvori sadržaj nekog polja iz baze u velika slova.

Ovo je moj upit koji mi odrađuje posao, dok se sve lepo kuca.
SELECT arhiva.*, list.* FROM list LEFT JOIN arhiva ON list.InvertarniBroj = arhiva.arhivaid WHERE arhiva.VrstaGradje LIKE '%9%' AND arhiva.Autor LIKE '%МАКСО%'

arhiva.Autor je polje u bazi čiji sadržaj treba konvertovati u velika slova.

Pozdrav

Marko Аcović

Nisam siguran da li sam te dobro razumeo, ali mislim da problem mozes da resis pomocu f-je UPPER(string). Pogledaj na: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_upper

Pozz :)

holodoc

16.04.2008, 22:36 #2 Poslednja Izmena: 16.04.2008, 23:04 od holodoc
Pa zar smo toliko postali popularni :D

Elem da ne dužim mnogo...

"Eeeeeevooo rešeeeeenja" (Copyright by Radovan III)

Ajde prvo kod pa kasnije objašnjenje :)

<?php
  
//podešavanje internog enkodinga PHP-a
  
mb_internal_encoding("utf-8");
  
//podešavanje enkodinga za headere (ponekad treba zbog formi)
  
mb_http_output("utf-8");
  
//termin koji se pretražuje, poslat GET ili POST formom 
  
$q $_REQUEST['q']; 
  
//ovde ide eventualno kod koji pretvara latinicu u ćirilicu inače se očekuje ćirilica kao ulaz
  
$konekcija mysql_connect("localhost",KORISNIKLOZINKA);
  
//ovo je obavezna stavka jer inače ne možemo da kontrolišemo kakve sve konverzije mogu da se dese u toku upita
  
mysql_query("set names utf8"$konekcija) or die(mysql_error());
  
//i kolacija i kolacija....
  
mysql_query("set collation_connection=utf8_unicode_ci"$konekcija) or die(mysql_error());
  
//biramo bazu
  
mysql_select_db("arhiva");
  
$sql "SELECT arhiva.*, list.* 
FROM list LEFT JOIN arhiva ON list.InvertarniBroj = arhiva.arhivaid 
WHERE arhiva.VrstaGradje LIKE '%9%' AND arhiva.Autor LIKE '%МАКСО%' AND UCASE(Autor) LIKE '%"
.mb_strtoupper($q)."%'";
 
 
$rezultat mysql_query($sql$konekcija) or die(mysql_error());;
  if(
mysql_num_rows($rezultat)){
    echo 
"Rezultati pretrage:<br />"
    while(
$zapis mysql_fetch_assoc($rezultat)){
        echo 
"{$zapis['id']}\t {$zapis['Autor']}<br />";
    }
  } else
    die(
"Žao nam je ali traženi autor ne postoji u bazi podataka!");
?>


Par bitnih stavki objašnjenih kroz kod :)

Ko prvo ova dva reda

mb_internal_encoding("utf-8");
mb_http_output("utf-8");

na početku su jako bitna kad radiš sa karakterima koji ne spadaju u engleski alfabet. Sa njima podešavaš koji enkoding će se koristiti za mb_ funkcije. Ovde mislim pre svega na mb_strtoupper bez koga bi dobio neki krš od karaketra u SQL stringu.

Sledeće dve linije se brinu o tome da komunikacija sa bazom uvek bude vođena preko utf8 karakter seta da se ne bi očitavalo đubre usled neusaglašenih enkodinga mysql servera i php-a.

mysql_query("set names utf8", $konekcija) or die(mysql_error());
mysql_query("set collation_connection=utf8_unicode_ci", $konekcija) or die(mysql_error());


Kako radi SQL izraz. Pored svega onoga što si ti naveo u svom upitu još je na kraju dodat uslov

UCASE(Autor) LIKE '%".mb_strtoupper($q)."%'
Cela stvar je u tome da se iz svih rezultata u bazi sada prikazuju samo oni zapisi koji kada se prebace komplet u velika slova sadrže string koji se pretražuje.

Usput... Nisi radio bilo šta sa podacima kod čitanja iz baze tako da sada možeš bez problema da ih koristiš za ispis ;)
<?php
abstract class Ignorance extends Stupidity implements Unavoidable 
    private function 
__construct(){
        
parent::__destruct();
    }; 

// EOF -> life.php

holodoc

@markogm
E ne verujem :) Ceo dan stoji ovaj post i opet odgovorim odmah posle tebe :P
<?php
abstract class Ignorance extends Stupidity implements Unavoidable 
    private function 
__construct(){
        
parent::__destruct();
    }; 

// EOF -> life.php

Marko Аcović

Sta ces, hajduk sam pravi. Kadar stici, uteci i na strasnom mestu postojati  8)

maxogm

Hvala čim budem testirao ovo javljam dal sam ga naterao da radi...

maxogm

Zaboravih da završim ovu temu.
Hvala @holodoc i @marko_gm, ovo @holodoc - ovo rešenje mi odradjuje posao.
Pozdrav

holodoc

Citat: maxogm  30.04.2008, 13:14
Zaboravih da završim ovu temu.
Hvala @holodoc i @marko_gm, ovo @holodoc - ovo rešenje mi odradjuje posao.
Pozdrav
Nema problema  :friends: Oko honorara ćemo se već dogovoriti  <:-P
<?php
abstract class Ignorance extends Stupidity implements Unavoidable 
    private function 
__construct(){
        
parent::__destruct();
    }; 

// EOF -> life.php

Marko Аcović

Necete da me prevarite, koliki je moj deo?  <:-P <:-P <:-P