Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何替换mysql数据库中字段中的字符0x1f_Php_Mysql - Fatal编程技术网

Php 如何替换mysql数据库中字段中的字符0x1f

Php 如何替换mysql数据库中字段中的字符0x1f,php,mysql,Php,Mysql,我有一个数据库,其中无论出于何种原因,字段都包含字符0x1f。我希望从包含0x1f的表中的每一行中删除此字符 我能找到的最接近于找到受影响的行(有效)的方法是“从TABLENAME中选择*,其中FIELDNAME转换(FIELDNAME使用ASCII)”,但我对此并不高兴,无论是在phpmyadmin还是在使用php 任何帮助都将不胜感激。多谢各位 编辑:为混乱而道歉。0x1f不在字段名中,它在字段行中 编辑2: 作为旁注,在站点本身上,我使用“$title=preg_replace('/[^[

我有一个数据库,其中无论出于何种原因,字段都包含字符0x1f。我希望从包含0x1f的表中的每一行中删除此字符

我能找到的最接近于找到受影响的行(有效)的方法是“从TABLENAME中选择*,其中FIELDNAME转换(FIELDNAME使用ASCII)”,但我对此并不高兴,无论是在phpmyadmin还是在使用php

任何帮助都将不胜感激。多谢各位

编辑:为混乱而道歉。0x1f不在字段名中,它在字段行中

编辑2: 作为旁注,在站点本身上,我使用“$title=preg_replace('/[^[:print:]\r\n]/',''$title);”进行数据导出以删除不需要的字符,但已被要求清理数据库本身

编辑3:

到目前为止,使用notepad++中的复制和粘贴,而不是%%I-see%FS%的工作原理是什么。我使用notpad++从导出中复制了FS。(希望有道理)

$mysqli->set_字符集(“utf8”);
$sql=“从wp_帖子中选择帖子标题,其中帖子标题类似“%””;
$stmt=$mysqli->prepare($sql);
$stmt->execute();
$result=$stmt->get_result();
而($row=$result->fetch_assoc())
{
//打印(行);
echo$row['post_title']。“
”; }
您需要这样的东西:

UPDATE myTable
SET myCol = REPLACE(myCol, '%1f', UNHEX('1f'))
WHERE myCol LIKE '%\%1f%';

实际上,在MySQL中,当您插入0x1f值时,如果该列是INT数据类型,那么它将存储为31。下面的查询将非常有用

从TABLENAME中选择*,其中FIELDNAME=31

如果列是VARCHARCHAR数据类型,则将插入0x1f值。下面的查询将非常有用

从表名中选择*字段名='0x1f'

如果字符中包含'0x1f',则可以使用

从TABLENAME中选择*字段名,如“%0x1f%”


以下是根据其他答案和评论编写的最终脚本。请记住“%%”实际上是%FS%”,其中FS是从使用记事本++查看的导出中复制的,因为此文本框中的字符编码隐藏了字符0x1f

我仍然想知道,在mysql中不使用php是否可以实现这一点,因此,在这一点上,这个问题没有得到回答。感谢大家的帮助

function connect($host, $user, $pass, $db)
{
    $mysqli = new mysqli($host, $user, $pass, $db);
    if($mysqli->connect_error) 
        die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
    return $mysqli; 
}
$mysqli=connect("localhost","user","password","dbname");
$mysqli->set_charset("utf8");
$sql="select id,post_title from wp_posts where post_title like '%%'";
$stmt = $mysqli->prepare($sql);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
    $title = preg_replace( '/[^[:print:]\r\n]/', '',$row['post_title']);
    $newsql="update wge8b198b_posts set post_title=\"".$title."\" where id=".$row['id'];
    $stmt2 = $mysqli->prepare($newsql);
    $stmt2->execute();
}
mysqli_close($mysqli);

这将从表“wp_posts”列“post_title”中删除不需要的字符“0x1F”


类似于
updatetablename SET FIELDNAME=REPLACE(FIELDNAME,CHAR(31),“”)
work?或者甚至
updatetablename SET FIELDNAME=SUBSTRING\u INDEX(FIELDNAME,CHAR(31),1)
唉,不是。我从另一个答案尝试了这个,但问题不是字段名。什么?这不会取代“FIELDNAME”中的那个字符“但是该列中的数据。我不是建议更改表列名。这只是一个更新,它将替换data.Aha行中的所有
0x1f
。很抱歉误会了,但正如我所说的那样,它不起作用。我只是得到两个答案的“0行受影响”。如果进入phpmyadmin并将表数据导出到SQL文件,则可以在textpad中打开该文件,只需查找/替换字符,然后重新导入数据。可能更快。这是其中的一件事,找到“干净”或光滑的方式其实并不重要。快速使用蛮力和“git'er done”可以在研究巧妙方法所需的时间内完成。然后防止这些字符将来进入数据库,问题就解决了。不。这是一个varchar,我怀疑无效字符来自导入或黑客攻击。我认为它是像(0x1f)一样插入的。因此,您可以使用select*from TABLENAME,其中FIELDNAME='0x1f'没有;不起作用,因为字符在字段中,所以我认为它需要一个like语句。如果您有数据库访问权限,请检查数据库中的列值并根据该值进行选择,您可以使用select*from TABLENAME,其中字段名类似“%0x1f%”;唉,也不是。我的问题在于字段行,而不是字段名我尝试了你的建议,但没有成功。在wordpress表中,我有许多行包含0x1f字符。我正在努力搜索这些行,而“LIKE“\%1f%”返回了一个空集。如果没有数据,这很难测试。您能否提供
INSERT
语句?如果没有:请在此处查找MySQL十六进制处理函数:执行导出操作,相关字段显示为,例如,“data[FS]more data”,其中[FS]是0x1f的符号。除此之外,我不能发布insert语句,因为它不能在这些文本框中正确显示FS。
function connect($host, $user, $pass, $db)
{
    $mysqli = new mysqli($host, $user, $pass, $db);
    if($mysqli->connect_error) 
        die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
    return $mysqli; 
}
$mysqli=connect("localhost","user","password","dbname");
$mysqli->set_charset("utf8");
$sql="select id,post_title from wp_posts where post_title like '%%'";
$stmt = $mysqli->prepare($sql);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
    $title = preg_replace( '/[^[:print:]\r\n]/', '',$row['post_title']);
    $newsql="update wge8b198b_posts set post_title=\"".$title."\" where id=".$row['id'];
    $stmt2 = $mysqli->prepare($newsql);
    $stmt2->execute();
}
mysqli_close($mysqli);
UPDATE [wp_posts]
SET [post_title] = REPLACE([post_title], CHAR(0x1F), '')
WHERE [post_title] LIKE'%' + CHAR(0x1F) + '%'