我有这种格式的字符串
const
现在我想用$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'
答案 0 :(得分:0)
您一次又一次地替换$ 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;
答案 1 :(得分:0)
您的参数数组可以包含字段名称吗?如果是这样,请尝试一下:
$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);
}
答案 2 :(得分:0)
很难知道字段名称和值的含义,但是假设您有一个字段名数组和上面显示的值。
第一件事就是将@
添加到键的开头,然后使用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语句,因为它们提供了其他功能,这些功能对于现代网站是无价的。 >
答案 3 :(得分:0)
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
的更多信息