【问题标题】:PHP "str_replace" doesn't work properly in some case?PHP“str_replace”在某些情况下不能正常工作?
【发布时间】:2014-03-28 17:35:13
【问题描述】:

下面是我正在使用的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");

【问题讨论】:

  • 去掉str_replace()内变量名的引号
  • @JohnConde 是对的,它采​​用文字字符“$icc”和“$content”
  • 谢谢我之前试过了,但是没用。
  • 你能添加更多细节吗,3 2 值示例。 $line_of_text、$icc 和 $content 中有什么。 str_replace 需要做替换,它会尽可能地做。
  • 在这种情况下,引号是无关紧要的;它只是保留文字美元符号的单引号。然而,他们仍然不需要(也不应该)在那里。

标签: php sql-server csv str-replace


【解决方案1】:

首先,你打开同一个文件三次,只关闭一次。这不是一个大问题,但你真的应该养成完成/关闭你开始的习惯。您可以使用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 ','

【讨论】:

    【解决方案2】:

    删除变量周围的引号。

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

    【讨论】:

    • $line_of_text[1] 这个变量有什么?我看到您提供的代码中未分配 $line_of_text
    • $line_of_text[1] 是数字 - 数量
    • 我无法完全理解您的问题,但请检查我的更新答案是否有帮助
    • 看来你的代码逻辑有问题。检查$content 有什么,并尝试单独处理每一行。
    【解决方案3】:

    没有调试输出数据..只能给点建议..

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

    【讨论】:

    • 。$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] 具有相同的值非常感谢
    【解决方案4】:

    我不确定我是否理解,但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";
    

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

    祝你好运。

    【讨论】:

      【解决方案5】:

      $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" .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-30
        • 2016-11-06
        • 1970-01-01
        • 2021-05-30
        • 2018-11-28
        相关资源
        最近更新 更多