2015-09-23 30 views
2

任何字我有假期的人「身份證」,「天」,「月」,「名」SQL選擇行,其中列包含從string

<table rules='all' border='black'> 
 
     <tr> 
 
      <td>id</td> 
 
      <td>day</td> 
 
      <td>month</td> 
 
      <td>name</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>1</td> 
 
      <td>5</td> 
 
      <td>Adam</td> 
 
     </tr> 
 
     <tr> 
 
      <td>2</td> 
 
      <td>2</td> 
 
      <td>5</td> 
 
      <td>Pavel a Petr</td> 
 
     </tr> 
 
</table>
我節省表從人的假期變成 strtolower($name) => $name = Pavel a Petr

的名字,我有一個用戶一個表,其中名稱爲Pavel

現在我需要的SQL查詢它可以select * from users where lower(name) contains '".$name."'

我正在尋找SQL解決方案。 如果沒有SQL解決方案,有人可以給我一個php解決方案。

謝謝。

+0

您可以使用SELECT * FROM用戶那裏名稱,比如%$名。 %邏輯? – Rashid

+0

這不起作用。我需要選擇是否包含字符串中的任何單詞 – koca79331

+0

您是否正在使用全文搜索? –

回答

0

您可能想要使用LIKE進行模式匹配。 (姓名)LIKE'%$ name%'; SELECT * FROM users where lower(name)LIKE'%$ name%';

%是通配符運算符,因此它允許名稱前後的任何內容。

0

可以使用REGEXP

SELECT * FROM `users` WHERE LOWER(name) RLIKE "[[:<:]]$name[[:>:]]" 
+0

我會試試,這個選項我沒試過。 – koca79331

+0

不工作......重要的是$ name = Pavel a Petr和用戶名字欄是Pavel – koca79331

+0

@ user5366720你的問題對我來說並不清楚。你能包括一個樣本數據和你的預期輸出嗎? –

3

嘗試使用MySQL LIKE Clause

如:

"select * from `users` where lower(name) LIKE '%$name%'" 

如果SQL LIKE子句與%字符一起使用,那麼它會像元字符(*),同時在命令提示符下列出所有文件或目錄。

0

也許正是這個你正在尋找:

編輯:你不應該有一個名爲「一」 :-)

EDIT2用戶:剛發現,該SQL服務器標籤帶走...

DECLARE @peopleHolidays TABLE(id INT,day INT,month INT, name VARCHAR(100)); 
INSERT INTO @peopleHolidays VALUES(1,1,5,'Adam'),(2,2,5,'Pavel a Petr'),(2,3,5,'Adam a Max'),(2,4,5,'Max a Petr'); 

DECLARE @users TABLE(id INT IDENTITY,name VARCHAR(100)); 
INSERT INTO @users VALUES('Adam'),('Pavel'),('Petr'),('Max'); 

SELECT * 
FROM @peopleHolidays AS pH 
CROSS APPLY(SELECT CAST('<r>' + REPLACE(pH.name,' ','</r><r>') + '</r>' AS XML)) AS AsXml(x) 
CROSS APPLY 
(
    SELECT * FROM @users AS u 
    WHERE u.name IN 
    (
     SELECT a.b.value('.','varchar(max)') 
     FROM AsXml.x.nodes('/r') AS a(b) 
    ) 
) AS UsersInHoliday 
0

正如其他海報所說,LIKE會給你一個比較字符串的一部分。您可以使用字符串連接爲類似的說法,因此通過你在SQL注入太多的風險

select * from users where name like '%' + :name + '%' 

使用準備在PHP語句安全,而不是搜索的字符串;

How can I prevent SQL-injection in PHP?

PDO::prepare

0

所以我解決了這個由PHP,而不是由SQL,代碼看起來就像

function isClientInDb($name, $array){ 
     global $db; 

     $name = strtolower($name);  

     $query = "SELECT * from `clients` where LOWER (name) = '".$name."' and `uid`='".$_SESSION['uid']."'"; 
     $result = $db->select($query);  
     if(count($result) < 1){ 

     if(intval(preg_match('/\s/',$name)) > 0){ 
      if(strpos($name, ",")){ 
       $pos = strpos($name, ",");  
       $minus = 1; 
      }else{ 
       if(strpos($name, "a")){ 
       $pos = strpos($name, "a"); 
       $minus = 0;   
       }else{ 
       $pos = strpos($name, " "); 
      }   
      }   
      $pole = array(strtolower(substr($name,0,$pos)), strtolower(substr($name,-($pos+$minus)))); 

      $sql = "lower(name) = '".$pole[0]."' or lower(name) = '".$pole[1]."'";    
      }else{ 
      $sql = "lower(name) LIKE '%".$name."%'";    
      }  

     $query = "SELECT * from `clients` where ($sql) and `uid`='".$_SESSION['uid']."'"; 
     $result = $db->select($query); 
     if(count($result) < 1){ 
      return false;   
         }else{ 
          return true; 
         } 


     }else{ 
     return true;   
     } 
     }