[英]Replacing text in string using values from an array in PHP
我有这种格式的字符串
$update_script = "update public.textcontrols3 set textboxvalue='@textboxvalue',textcontrols_id='@textcontrols_id',textcontrols3_id='@textcontrols3_id' where textcontrols3_id='@textcontrols3_id' ";
现在我想从而替换所有占位符与文本@
与诸如从数组值在从$reverse['1','abc','medo'];
我尝试使用这种方法:
for ($i=0;$i<=sizeof($reverse);$++) {
$copy_reverse =
preg_replace("/(@".$field_name.")/",$reverse[$i],$update_script);
}
其中$field_name
是来自数据库的变量,它等效于文本,位于@
符号之后。 因此,我要实现的输出是:
update public.textcontrols3 set
textboxvalue='medo',textcontrols_id='abc',textcontrols3_id='1' where
textcontrols3_id='1'
您将一次又一次替换$ update_script变量。 因此它将替换最后一个字段并还原为原始字段。 因此,将$ update_script的副本复制到$ copy_reverse并继续替换它们。
$reverse= ['1','abc','medo'];
$copy_reverse = $update_script;
for ($i=0;$i<=sizeof($reverse);$i++) {
$copy_reverse = preg_replace("/(@".$field_name.")/",$reverse[$i],$copy_reverse);
}
echo $copy_reverse;
您的参数数组可以包含字段名称吗? 如果是这样,请尝试:
$update_script = "update public.textcontrols3 set textboxvalue='@textboxvalue',textcontrols_id='@textcontrols_id',textcontrols3_id='@textcontrols3_id' where textcontrols3_id='@textcontrols3_id' ";
$params = [
"textboxvalue" => "1",
"textcontrols_id" => "abc",
"textcontrols3_id" => "def"
];
foreach ($params as $key => $value) {
$update_script =
preg_replace("/(@".$key.")/", $value, $update_script);
}
很难知道字段名称和值的含义,但是假设您有一个字段名和上面显示的值的数组。
首先是在键的开头添加一个@
,然后使用array_combine()
组合键和值。
然后使用strtr
替换字段值。 当替换字符串序列时, strtr()
效果更好,因为您的字段的顺序可能会影响结果, strtr()
始终首先执行最长的键以确保正确完成此操作。
$update_script = "update public.textcontrols3 set textboxvalue='@textboxvalue',textcontrols_id='@textcontrols_id',textcontrols3_id='@textcontrols_id1' where textcontrols3_id='@textcontrols_id1' ";
$fields = [
"textboxvalue",
"textcontrols_id",
"textcontrols_id1"
];
$params = [
"1",
"abc",
"def"
];
array_walk($fields, function (&$keyName) { $keyName = "@".$keyName;} );
$update_script = strtr($update_script, array_combine($fields, $params));
echo $update_script;
我想提出的另一件事是,如果您尝试创建自己的“ prepared”语句,则应改用PDO或mysqli prepared语句,因为它们提供了其他功能,这些功能对于现代网站是无价的。
PDO
是执行查询的更好,更安全的方法。
例:
$host = '127.0.0.1';
$db = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=$charset", $user, $pass, $options);
$sql = "UPDATE public.textcontrols3 SET
textboxvalue=':textboxvalue',
textcontrols_id=':textcontrols_id',
textcontrols3_id=':textcontrols3_id'
WHERE textcontrols3_id=':textcontrols3_id' ";
$data = [
"textboxvalue" => "1",
"textcontrols_id" => "abc",
"textcontrols3_id" => "def"
];
$stmt= $pdo->prepare($sql);
$stmt->execute($data);
替换和转义仅通过一个字符串实现$pdo->prepare($sql);
。
您可以在https://phpdelusions.net/pdo上了解有关PDO
更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.