我需要从"<div"
开始剪切一段文本片段。
我有一些这样的:
$query = mysql_query("Select * from products_description");
while($row = mysql_fetch_array($query))
{
$usun = substr($row['products_description'], 0, strpos($row['products_description'], "<div"));
mysql_query('UPDATE products_description SET products_description = '.$usun.' WHERE products_id = '.$row['products_id'].'');
}
不幸的是它不起作用
答案 0 :(得分:1)
如果我们回显出SQL文本(代码试图执行的UPDATE语句),我们会看到部分问题。
字符串文字需要用单引号括起来。
... SET products_description = 'string literal' WHERE ...
^ ^
另一个问题是我们没有看到任何保证字符串文字值不会包含可能不安全的值,例如单引号。在将它们包含在SQL文本中之前,应该对潜在的不安全值进行适当的转义。
当然,如果我们使用带有绑定占位符的预备语句 ,我们将完全避免这两个问题。
假设PHP substr
函数正在返回你想要分配给列的值...当我们可以一举完成同样的事情时,真的没有必要处理RBAR(通过痛苦的行行)
UPDATE mytable SET mycol = SUBSTRING_INDEX(mycol,'<div',1) ;
在我们提交运行UPDATE语句之前,我们可以在SELECT语句中测试我们的表达式。例如:
SELECT t.mycol
, SUBSTRING_INDEX(t.mycol,'<div',1) AS newval
FROM mytable t
答案 1 :(得分:0)
首先,使用PDO而不是mysqli_或mysql_函数。然后你可以使用参数绑定。它有助于防止SQL注入。
在将$usun
连接到SQL请求之前,您应引用$usun=mysql_real_escape_string($usun);
:
var sql = $"SELECT * FROM objects WHERE id = @id";
using (var connection = new NpgsqlConnection(connectionString))
using (var cmd = new NpgsqlCommand(sql, connection))
{
try
{
await connection.OpenAsync();
cmd.Parameters.AddWithValue("id", id);
using(var reader = await connection.ExecuteReaderAsync(cmd))
{
if (reader.HasRows)
{
var objects = await ProtobufSQL.DataReaderToType(modelType, reader);
var data = objects[0];
state.Data = data;
}
}
catch (Exception e)
{
Log.Error(1, e.Message, e);
}
}
答案 2 :(得分:0)
目前还不清楚为什么你问题中的确切代码不起作用(虽然其他人引用的引用问题肯定是问题的一部分)但是这可能无论如何都会回答这个问题,因为我&#39 ;提出完全不同的东西。
尝试执行一次更新查询,删除字符串开头的<div
,而不是select / loop / update方法。
UPDATE products_description
SET products_description = SUBSTRING(products_description FROM 5)
WHERE products_description LIKE '<div%'
或者,如果您想删除 <div
之后的所有:
UPDATE products_description
SET products_description = '<div'
WHERE products_description LIKE '<div%'