PHP" str_replace"在某些情况下不能正常工作?

时间:2014-03-28 17:35:13

标签: php sql-server csv str-replace

以下是我正在使用的PHP代码

$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");

5 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:4)

首先,您打开相同的文件三次,只关闭一次。这不是一个主要问题,但你应该养成完成/关闭你开始的习惯的习惯。您可以使用fopen

跳过其中一个file_get_contents
$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 ','

答案 2 :(得分:1)

没有调试输出数据..我只能给出一些建议..

  • $ line_of_text [1]和$ icc是否按预期值输出?
  • sqlsrv_fetch_array($ stmt,SQLSRV_FETCH_ASSOC)是否返回正确的值? (如果不是,它将不会做任何事情)
  • 你的csv文件结构如何?

答案 3 :(得分: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";

否则,我同意其他人的说法,双引号是可选的。 :)

祝你好运。

答案 4 :(得分:1)

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

这应该替换为

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

因为这些是php变量并且将它们放在双引号或单引号中是不正确的,因为它们将被视为普通文本而str_replace将尝试将“$ line_of_text [1]”替换为“$ content”中的“$ icc”