2013-03-27 6 views
0

나는 학교에서 MySQL과 PHP를 사용하여 검색 프로그램을 배웠다. , MySQL/PHP가 있지만 대소 문자는 구분하지 않음

<?php 
mysql_connect("localhost", "root", ""); 
mysql_select_db("db1"); 

$sql = "SELECT * from tuser"; 
$Namen = mysql_query ($sql); 
$user_id = $_GET['user_id']; 
$search = $_GET['search']; 

while ($ergebnis_datensatz = mysql_fetch_array($Names)){ 
    $user_id = $ergebnis_datensatz['user_id']; 
    $name = $ergebnis_datensatz['name']; 
    $surname = $ergebnis_datensatz['surname']; 

    if ($name == "$search") { 
     echo "$name $surname"; 
    } 

    else { 
     echo ""; 
    } 


    if ($surname == "$search") { 
     echo "$name $surname"; 
    } 

    else { 
     echo ""; 
    } 

} 


?> 

그리고 내 검색 입력 사이트에서

내가 "이름 = 검색"지금이 검색을 사용하는 경우

과 간단한 입력을 가지고

나는 나의 search.php이 코드를 대소 문자를 구분합니다. 예 : "* k * elvin"을 검색하면 아무 것도 표시되지 않습니다. 그러나 "* K * elvin"을 검색하면 결과가 나타납니다.

어떻게 대소 문자를 구분하지 않을 수 있습니까?

답변

2

테이블의 데이터 정렬을 확인하십시오. 기본적으로 (구성에 따라) MySQL은 utf8_general_ci을 사용합니다. 여기에서 ci은 대소 문자를 구분하지 않습니다. 반면에 utf8_bin을 사용하면 대소 문자를 구분하는 데이터 정렬이 이루어지며 모든 검색은 대소 문자를 구분합니다.

기타 공통 데이터 정렬은 latin1_general_ci (및 *_cslatin1_bin)입니다.

1

정말 쿼리를 최적화하고 관련 옵션 만 검색해야합니다.

두 매개 변수를 모두 소문자로 바꾸면 대소 문자를 구분하지 않아도 검색 할 수 있습니다 (예 :). 그런 식으로, 당신의 코드가 될 것이다 : 당신의 검색 매개 변수와 일치하는 모든 결과를 얻을 것입니다 SELECT * from tuser WHERE name LIKE $search OR surname LIKE $search : if (strtolower($name) == strtolower($search)) { 및 그러나

if (strtolower($surname) == strtolower($search)) {, 내가 대신 같은 당신의 쿼리를 제한하는 것입니다.

은 $ 탈출

0

당신은 두 개의 문자열을 비교하기 위해 strcasecmp() 기능을 사용할 수 있으며 대소 문자 구분을 무시하고 검색하는 것을 잊지 마십시오. 에

if ($name == "$search") { 

:

이미 언급했듯이
if (strcasecmp($name, $search)) { 
+0

은 "strcasecmp"와 "$ 이름 == $ 검색"하면 코드가 더있는 경우 (strcasecmp ($ 이름, $ 검색 "과 같을 것이다,보고 싶어하는 경우) == 0) "이면 binairy 문자열이 0보다 크거나 같거나 0보다 작 으면 0을 반환합니다. –

1

, 가장 일반적인 MySQL의 데이터 정렬은 대소 문자를 구별하지 않는다. 그러나 데이터 정렬을 수정하지 않으려면 BINARY 연산자를 사용하여이 문제를 해결할 수 있습니다.

http://dev.mysql.com/doc/refman/5.0/en/charset-binary-op.html

즉 그래서 중요

$sql = 'SELECT * FROM tuser WHERE BINARY "'.$search.'" IN (name,surname)'; 

이 조심주는

SELECT * 
FROM tuser 
WHERE BINARY $search IN (name,surname) 

. 현재 이것은 잠재적으로 SQL을 사출에 개방 된 상태로 남겨 둘 것입니다. 이것은 EVERYTHING을 선택하고 PHP에서 루핑하는 것보다 효율적이지만 코드 개선이 먼저 필요할 것입니다.여기

여기에 SQL 주입에 대한에 대답 How can I prevent SQL injection in PHP?

관련 문제