2013-02-22 37 views
0

我在製表符分隔符文件(txt或csv文件)中有以下數據。MySQL:曲線撇號'WHERE子句無返回

Adams’ Inn 
Ambassador Inn a 
Amberley Suite 
America’s Best Inn 
Amber's Inn 

我有一個PHP腳本,將讀取這些數據插入到數據庫中。但是,在插入腳本之前,請檢查它們是否已經存在。

$stmt = $sql->prepare("SELECT ID,Name FROM `establishment` WHERE Name=?"); 
$stmt->bind_param("s",$Name); 
$stmt->execute() or die($stmt->error); 
$stmt->store_result(); 
if($stmt->num_rows==0){ 
    // do insert query 
} 
else{ 
    $stmt->bind_result($ID,$Name); 
    $stmt->fetch(); 
    print "$ID:$Name already exist"'; 
} 

注:假設establishment表已具有以下數據。我有結構和數據如下:

/*Table structure for table `establishment` */ 

DROP TABLE IF EXISTS `establishment`; 

CREATE TABLE `establishment` (
    `ID` int(9) NOT NULL AUTO_INCREMENT, 
    `Name` varchar(64) DEFAULT NULL, 
    KEY `ID` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 

/*Data for the table `establishment` */ 

insert into `establishment`(`ID`,`Name`) values (1,'Ambassador Inn '),(2,'Adams’ Inn'),(3,'Amberley Suite'),(4,'Amber\'s Inn'),(5,'America’s Best Inn '); 

現在,腳本執行罰款沒有錯誤,但問題是,曲線撇號不能搜索。

那麼,任何想法,爲什麼這是發生在曲線撇號

另注:當手動把它放在一個變量$Name = "Adams’ Inn"它工作正常。

+0

有你使用'$ stmt-> bind_param( 「S」,和addslashes($名));'。試試吧。 – 2013-02-22 04:06:43

+0

@YogeshSuthar參數化查詢的重點在於您不必這樣做。 – 2013-02-22 04:08:38

+0

@tc。完全同意 :)。我認爲如果我們能夠嘗試並可能解決問題。 – 2013-02-22 04:10:03

回答

0

這解決了這個問題。

<?php 
    function utf8_fopen_read($fileName) { 
     $fc = iconv('windows-1250', 'utf-8', file_get_contents($fileName)); 
     $handle=fopen("php://memory", "rw"); 
     fwrite($handle, $fc); 
     fseek($handle, 0); 
     return $handle; 
    } 
?> 

演示:

<?php 
    ini_set('default_charset','utf-8'); 
    header('content-type: text/plain'); 
    $sql = new mysqli('localhost','root','','test'); 
    $sql->set_charset('utf8'); 

    $rows = array(); 

    $fh = utf8_fopen_read("sample.txt"); 
    while (($data = fgetcsv($fh, 1000, ",")) !== false) { 
     foreach ($data as $value) { 
      $rows[] = $value; 
     } 
    }  

    foreach($rows as $row){  
     $row = trim($row); 
     $Name = $row; 

     print "$Name\r\n"; 
    } 

    print "-----------------\r\n"; 

    foreach($rows as $row){  
     $Name = trim($row); 

     $stmt = $sql->prepare("SELECT ID,Name FROM `establishment` WHERE Name=?"); 
     $stmt->bind_param("s",$Name); 
     $stmt->execute() or die($stmt->error); 
     $stmt->store_result(); 
     if($stmt->num_rows==0){ 
      // do insert query 
     } 
     else{ 
      $stmt->bind_result($ID,$Name); 
      $stmt->fetch(); 
      print "$ID:$Name already exist\r\n"; 
     } 
    } 
    ?> 

另存爲樣本。TXT(製表符分隔符的文件):

Adams’ Inn 
Ambassador Inn a 
Amberley Suite 
America’s Best Inn 
Amber's Inn 
1

這很可能是編碼問題。
正確的編碼沒有設置或您的一些撇號手動編碼。

確保你的表對他們utf8編碼
請確保您連接後調用

$db->set_charset('utf8') 


確保您的代碼不執行無用的編碼像用htmlspecialchars左右(這樣做寫入新apostrother數據庫,並嘗試讀回後):

  • 從數據庫中選擇您的問題的價值,然後urlencode()
  • 讀它從CSV值對應,並urlencode()
  • 比較結果
+0

我有$ sql-> set_charset('utf8');和數據庫也一樣,從表到列都是utf8。由於數據來自txt/csv文件,因此我不需要urlencode。 **注意:**從我的問題,當我手動將它設置爲單個數據的變量,它工作正常。 – 2013-02-22 07:31:20

+0

好吧,我做了urlencode(),但輸出與我的預期很不一樣。 – 2013-02-22 07:37:10