2014-03-28 122 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]” ”。

相关问题