SQL server Update & Ersetzen Spam in "Text" und "ntext" Felder

In erster Linie, vielen Dank für Ihre time, indem ich einen Blick auf dieses Thema.

Eine alte databasetabelle hat über 14k Spam-Links, die in sie injiziert werden, von denen viele in Text- und Ntext-Feldern sind. Ich habe eine SQL-Abfrage geschrieben, die alle Felder ausführt und aktualisiert, die nicht "Text" oder "ntext" sind, aber leider nicht die "Text" oder "ntext" Felder überhaupt aktualisieren.

Kurze Information über die database: Es läuft auf IIS7, ist SQL server 2008 und PHP ist aktiviert (Version 5.3). Leider habe ich sehr beschränkte Fähigkeit, die database direkt oder von einem Bedienfeld zu aktualisieren (sonst wäre das schnell gehandhabt worden), also schreibe ich dieses Skript in PHP, um automatisch kompromittierte Tabellen zu aktualisieren. Das Skript in dieser Form läuft ohne Fehler, aber ich habe keine Updates in den Text- oder Ntext-Feldern.

Das Skript ist wie folgt:

//Basic DB Connection $conn = database_info; $sql = "SELECT * FROM pages_test_only"; $result = sqlsrv_query($conn, $sql); //Loop to scrub each table foreach(sqlsrv_field_metadata($result) as $fieldMetadata) { //The loop here updates each section of spam (starting with </title>) with "" (empty/null) //and leaves other content intact. The double quotes in the spam are escaped (\"). //Text update - if the field type is 'text' if ($fieldMetadata['Type'] == -1) { $sqlupdate = "UPDATE pages_test_only SET ".$fieldMetadata['Name']." = CAST(REPLACE(CAST(".$fieldMetadata['Name']." as nvarchar(6000)), '</title><div style=\"display:block; text-indent:-5670px;\"><a href=\"http://buy-cialis-onlineusa.com\">generic cialis</a></div>', '') AS text"; } //Ntext update - if the field type is 'ntext' elseif ($fieldMetadata['Type'] == -10) { $sqlupdate = "UPDATE pages_test_only SET ".$fieldMetadata['Name']." = CAST(REPLACE(CAST(".$fieldMetadata['Name']." as nvarchar(6000)), '</title><div style=\"display:block; text-indent:-5670px;\"><a href=\"http://buy-cialis-onlineusa.com\">generic cialis</a></div>', '') AS ntext"; } //Any other update - if the field contains the spam, but is of any other type [this is working] else { $sqlupdate = "UPDATE pages_test_only SET ".$fieldMetadata['Name']." = REPLACE(".$fieldMetadata['Name'].", '</title><div style=\"display:block; text-indent:-5670px;\"><a href=\"http://buy-cialis-onlineusa.com\">generic cialis</a></div>', '')"; } //Send to DB $res = sqlsrv_query($conn, $sqlupdate); } 

Ich bin mir bewusst, dass die Umwandlung der Text- und Ntext-Felder in nvarchar dauerhaft ideal wäre, aber für diese Zwecke brauche ich die Tabellenstruktur zu bleiben, wie es ist, wenn das Skript abgeschlossen ist.

Darüber hinaus, wenn Sie wissen, ein path, um in Spalte Metadaten zu ziehen, ohne dass alles in SQL server 2008 SELECT, würde ich sehr schätzen diese Informationen, wie es beschleunigen meine Abfrage für die eigentliche Tabelle.

Bitte lassen Sie mich wissen, welche Probleme Sie sehen, und wieder vielen Dank für Ihre time.

Bearbeiten:

Während das Hauptproblem noch existiert, konnte ich nur den Feldnamen anziehen und mit dieser Abfrage eingeben:

 $sql = "SELECT COLUMN_NAME, DATA_TYPE FROM information_schema.columns WHERE TABLE_NAME = 'pages_test_only'"; $result = sqlsrv_query($conn, $sql); 

Es wird in einer while-loop angewendet:

 while($row = sqlsrv_fetch_array($result)){ echo $row['COLUMN_NAME']."<br />"; echo $row['DATA_TYPE']."<br />"; //update - text type if ($row['DATA_TYPE'] == 'text') { echo "This column is a text column.<br />"; $sqlupdate = "UPDATE pages_test_only SET ".$row['COLUMN_NAME']." = CAST(REPLACE(CAST(".$row['COLUMN_NAME']." as nvarchar(1000)), '</title><div style=\"display:block; text-indent:-5670px;\"><a href=\"http://buy-cialis-onlineusa.com\">generic cialis</a></div>', 'test') AS text"; } //update - ntext type elseif ($row['DATA_TYPE'] == 'ntext') { echo "This column is a ntext column.<br />"; $sqlupdate = "UPDATE pages_test_only SET ".$row['COLUMN_NAME']." = CAST(REPLACE(CAST(".$row['COLUMN_NAME']." as nvarchar(1000)), '</title><div style=\"display:block; text-indent:-5670px;\"><a href=\"http://buy-cialis-onlineusa.com\">generic cialis</a></div>', 'test') AS ntext"; } //update - any other type else { $sqlupdate = "UPDATE pages_test_only SET ".$row['COLUMN_NAME']." = REPLACE(".$row['COLUMN_NAME'].", '</title><div style=\"display:block; text-indent:-5670px;\"><a href=\"http://buy-cialis-onlineusa.com\">generic cialis</a></div>', 'test')"; } $res = sqlsrv_query($conn, $sqlupdate); } 

Ich bin ein bisschen peinlich, aber die Frage, die ich hatte, war Syntax. Ich habe eine Klammer am Ende jeder SQL-statement vergessen. Das heißt, hier ist die endgültige, Arbeitssatz von Updates:

 //basic connection information $serverName = "dbhost.etc"; //serverName\instanceName $connectionInfo = array( "Database"=>"db_name", "UID"=>"db_user", "PWD"=>"db_pass"); $conn = sqlsrv_connect( $serverName, $connectionInfo); //connection check if( $conn ) { echo "Connection established.<br /><br />"; } else { echo "Connection could not be established.<br />"; die( print_r( sqlsrv_errors(), true)); } //this selects ONLY the column name and type from the table $sql = "SELECT COLUMN_NAME, DATA_TYPE FROM information_schema.columns WHERE TABLE_NAME = 'table_name'"; $result = sqlsrv_query($conn, $sql); //a loop is set up for each column that checks for data type and casts/updates accordingly while($row = sqlsrv_fetch_array($result)) { //update - text type if ($row['DATA_TYPE'] == 'text') { $sqlupdate = "UPDATE table_name SET ".$row['COLUMN_NAME']." = CAST(REPLACE(CAST(".$row['COLUMN_NAME']." as nvarchar(max)), 'string', 'replacement') AS text)"; } //update - ntext type elseif ($row['DATA_TYPE'] == 'ntext') { $sqlupdate = "UPDATE table_name SET ".$row['COLUMN_NAME']." = CAST(REPLACE(CAST(".$row['COLUMN_NAME']." as nvarchar(max)), 'string', 'replacement') AS ntext)"; } //update - any other type else { $sqlupdate = "UPDATE table_name SET ".$row['COLUMN_NAME']." = REPLACE(".$row['COLUMN_NAME'].", 'string', 'replacement')"; } $res = sqlsrv_query($conn, $sqlupdate); }