2014-03-28 121 views
9

下面是PHP代碼我使用PHP「str_replace」在某些情況下無法正常工作?

$file_handle = fopen("products.csv", "r"); 
$fname = "products.csv"; 
$fhandle = fopen($fname,"r"); 
$content = fread($fhandle,filesize($fname)); 
$server = "**\******,1433"; 
$connectionInfo = array("Database"=>"******", "UID"=>"***", "PWD"=>"*******"); 
$conn = sqlsrv_connect($server, $connectionInfo); 

if($conn === false) { 
die(print_r(sqlsrv_errors(), true)); 
} 

while (!feof($file_handle)) { 
    $line_of_text = fgetcsv($file_handle, 1024); 
    $itemco = $line_of_text[0]; 
    $sql = "SELECT quantity FROM Item WHERE itemlookupcode = '$itemco' "; 
    $stmt = sqlsrv_query($conn, $sql); 

    if($stmt === false) { 
     die(print_r(sqlsrv_errors(), true)); 
    } 

    while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
     $icc = $row['quantity']; 
     $content = str_replace("$line_of_text[1]", "$icc", "$content"); 
    } 
} 

$fhandle = fopen($fname,"w"); 
fwrite($fhandle,$content); 
fclose($fhandle); 

str_replace沒有在下列情況下工作:

$content = str_replace("$line_of_text[1]", "$icc", "$content"); 
+3

擺脫'str_replace()'裏面變量名稱的引號' –

+1

@JohnConde是正確的,它將文字字符「$ icc」和「$ content」 –

+0

謝謝我以前試過,但它沒有工作。 – Max

回答

4

首先,你打開同一個文件三次,只關閉一次。這不是一個主要問題,但你真的應該養成/結束你開始的習慣。您可以通過使用file_get_contents跳過這些fopen之一:現在

$content = file_get_contents("products.csv"); 

str_replace將取代出現的字符串。例如,如果$line_of_text[1]是「11」而$icc是「9」,則諸如「110」的文件中的其他值將受到影響,從而使得未來替換的其餘部分每個循環越來越可靠。

如果我沒有記錯的話,所有你想要做的是每一行替換單個細胞,在這裏有一個建議: 創建一個空的變量,讓我們說$new_content

現在,改變你的循環:

while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
    $line_of_text[1] = $row['quantity']; // change cell value 
    $new_content .= implode(',', $line_of_text).','; // convert into string with extra 
                // ',' to avoid merging cells 
} 
$new_content = trim($new_content, ','); // remove extra ',' 
4

各地變量刪除引號。

$content = str_replace("$line_of_text[1]", "$icc", "$content"); 

應該

$content = str_replace($line_of_text[1], $icc, $content); 

//str_replace (search, replace, subject) This is how it works. 

接下來,

使用與while循環

$count=1; 
while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
$icc = $row['quantity']; 
$content = str_replace($line_of_text[$count++], $icc, $content); 
} 
+0

謝謝,但它不工作 – Max

+0

$ line_of_text [1]這是什麼變數呢?我看到$ line_of_text是在代碼中未分配的您提供 –

+0

$ line_of_text [1]是數 - 數量 – Max

1

沒有調試輸出數據,該代碼..我只能給一些建議。 。

  • $ line_of_text [1]和$ icc是否按預期值輸出?
  • 是否sqlsrv_fetch_array($ stmt,SQLSRV_FETCH_ASSOC)返回適當的值? (如果沒有,它將不會做任何事情)
  • 如何讓你的csv文件結構化?
+0

。是否將$ line_of_text [1]和$ icc輸出爲預期值?是的。sqlsrv_fetch_array($ stmt,SQLSRV_FETCH_ASSOC)是否返回適當的值?是的...如何讓你的csv文件結構化?我不明白這是什麼意思是唯一的問題是,當行具有相同的$ line_of_text [1]值..像行1 $ line_of_text [1] =「1」行2 $ line_of_text [1] =「1」,除了這個它的工作原理但只有$ line_of_text [1]中的每一個具有相同的值非常感謝 – Max

1

我不確定我是否理解,但沒有理由認爲str_replace不起作用。
這可能只是一個推理問題。
它根本不工作或只在某些情況下工作?
如果在某些情況下,可能是因爲替換值不再存在。

例如:

$content = "1234"; 
echo "$content\n"; // echo "1234" 
$content = str_replace("1", "a", "$content"); 
echo "$content\n"; // echo "a1234" 
$content = str_replace("2", "b", "$content"); 
echo "$content\n"; // echo "ab34" 
$content = str_replace("1", "c", "$content"); 
echo "$content\n"; // echo "ab34" => no change because '1' is not existe -> already replace 

我不知道這是不是你的問題,但它可以解釋。

那麼可能是你應該做這樣的事情:

$pos1 = stripos("$content", "$line_of_text[1]"); 
if ($pos1 !== false) 
    $content = str_replace("$line_of_text[1]", "$icc", "$content"); 
else 
    echo "$line_of_text[1] not found in $content \n"; 

否則,我同意其他人,雙引號是可選的。 :)

好運。

1

$含量= str_replace函數( 「$ line_of_text [1]」, 「$ ICC」, 「$內容」);

這應該與

$含量= str_replace函數($ line_of_text [1],$ ICC,$內容)來代替;

因爲這些都是php變量,並將它們放在雙引號或單引號中是不正確的,因爲它們將被視爲正常文本,str_replace將嘗試用「$ content」中的「$ icc」替換「$ line_of_text [1]」 」。

相關問題