Php 在不带纯文本的mysql字段描述中搜索html文本中的单词
我正在修改dolibarr中的代码,我遇到了一个问题,即使用WYSIG编辑器(记录html文本)在产品描述中进行搜索。搜索包含多个单词的描述在Php 在不带纯文本的mysql字段描述中搜索html文本中的单词,php,html,mysql,wysiwyg,dolibarr,Php,Html,Mysql,Wysiwyg,Dolibarr,我正在修改dolibarr中的代码,我遇到了一个问题,即使用WYSIG编辑器(记录html文本)在产品描述中进行搜索。搜索包含多个单词的描述在(可能是所有标记)之后不起作用,或者在文本的最开头,第一个单词不返回描述。另外,“galvanisé”和“é”一起使用,而不是带引号的“d'options”。见以下示例: 我试着使用htmlentities并包含标签的结束或开始(见下文) 说明: 过滤标准avec tout un tas d'options 900x400x116名称 22EN779-20
(可能是所有标记)之后不起作用,或者在文本的最开头,第一个单词不返回描述。另外,“galvanisé”和“é”一起使用,而不是带引号的“d'options”。见以下示例: 我试着使用htmlentities并包含标签的结束或开始(见下文) 说明: 过滤标准avec tout un tas d'options 900x400x116
名称 22
EN779-2002
for($i=0;$i'.$tabMots[0].%\'或p.description,如\'>'.$tabMots[0].'.htmlEntitys($tabMots[0])。%\';
}否则{
如果(是数字($tabMots[$i])){
$sql.='AND(p.description如\'%'。$tabMots[$i].%\'或p.description如\'>'.$tabMots[$i].%\'或p.description如\'''>'.%\'。$tabMots[$i].%\'或p.description如\''%>'.$tabMots[$i].'''.htmlentities($tabMots[$i.]].]].%');
}
}
}
为了不修改dolibarr数据库,我希望避免添加纯文本字段。谢谢
编辑:建议的答案是不好的,因为问题是文本描述的文本格式HTML而不是搜索标准。我认为您的错误将在于'
登录wordd'options
在SQL引擎中转义字符串
$tabMots[0] = "d'options";
$sql.= ' WHERE (p.description LIKE \'% '.$tabMots[0].'%\'';
echo $sql;
以上内容将打印出以下内容:
WHERE(p.description,如'%d'options%'
即使从StackOverflow高亮显示中,您也可以看到SQL引擎从中得到了什么
我强烈建议您切换到准备好的声明。请在此处阅读:
编辑
如何切换到准备好的语句?示例:
$param = $tabMots[$i];
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
$stmt->bind_param("s", $param);
$stmt->execute();
从这个答案复制粘贴:对于那些没有思考就输入-1的人,我想说,准备好的查询并没有解决我的问题,因为它正在格式化搜索的单词。这里的问题是描述文本的格式,我做了研究,在插入
htmlentities()后看到了这一点 保留\n和其他字符。但是,我不知道文本开头保留的字符。感谢帮助我实现了准备好的查询。因此,
如果您想在%和单词“%\n”。$word.%”之间留一个空格,则必须添加对插入的
的搜索。这里有前面带有
的单词的词根。和一行的第一个单词。它可以编辑什么?希望这能回答您的问题我知道准备好的语句谢谢。我想我没用,因为没有安全问题。您知道吗k它也可以解决我的第一个单词问题吗?我会尝试一下。更简单的否?$resql=$db->prepare($sql);$resql=$db->execute($tabMots);对不起,但是对于dolibarr 10中的DoliDB类的db,没有prepare函数。我想我必须复制纯文本字段,并用product修改dolibarr行为。可能是
$param = $tabMots[$i];
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
$stmt->bind_param("s", $param);
$stmt->execute();