PHP "str_replace" funktioniert in keinem Fall richtig?

Der unten ist der PHP-Code, den ich verwende

$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 funktioniert im folgenden Beispiel nicht:

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

Zuerst öffnen Sie die gleiche file dreimal und schließen Sie es nur einmal. Dies ist kein großes Problem, aber Sie sollten wirklich eine Gewohnheit zu beenden / schließen, was Sie begonnen haben. Sie können einen dieser fopen mit file_get_contents :

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

Jetzt wird str_replace jedes Vorkommen deiner characterfolge replace. Wenn zum Beispiel $line_of_text[1] "11" ist und $icc "9" ist, werden andere Werte in der file wie "110" beeinträchtigt, wodurch der Rest der zukünftigen Ersetzungen immer weniger zuverlässig ist.

Wenn ich mich nicht irre und alles, was Sie tun möchten, ist eine einzelne Zelle in jeder Zeile zu replace, hier ist ein Vorschlag: Erstellen Sie eine leere Variable, sagen wir, $new_content

Jetzt ändern Sie Ihre loop:

 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 ',' 

Zitate um variables entfernen.

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

Sollte sein

 $content = str_replace($line_of_text[1], $icc, $content); //str_replace ( search, replace, subject ) This is how it works. 

Nächster,

Verwenden Sie diesen Code, der der while-loop entspricht

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

Kein Debug-Ausgabedaten .. Ich kann nur einen Rat geben ..

  • Ist $ line_of_text [1] und $ icc als erwartete Werte ausgegeben?
  • Setzt sqlsrv_fetch_array ($ stmt, SQLSRV_FETCH_ASSOC) einen richtigen Wert zurück? (Wenn nicht, wird es nichts tun)
  • Hows Ihre csv-file strukturiert?

Ich bin mir nicht sicher, dass ich es verstehe, aber es gibt keinen Grund, dass str_replace nicht funktioniert.
Es kann nur eine Frage des Denkens sein.
Es funktioniert überhaupt nicht oder nur in einigen Fällen?
Wenn es in einigen Fällen ist, kann es sein, weil der Ersatzwert nicht mehr existiert.

Beispielsweise:

 $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 

Ich weiß nicht, ob das dein Problem ist, aber es könnte erklären.

So solltest du so etwas tun:

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

Ansonsten stimme ich den anderen zu, die doppelten Anführungszeichen sind optional. 🙂

Viel Glück.

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

dies sollte ersetzt werden durch

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

da diese php-variables sind und sie in doppelte oder einfache Anführungszeichen setzen, ist falsch, da sie als normaler Text betrachtet werden und str_replace versucht, "$ line_of_text [1]" mit "$ icc" in "$ content" zu replace.