使用PHP中数组中的值替换字符串中的文本

时间:2018-08-20 17:46:24

标签: php

我有这种格式的字符串

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'

4 个答案:

答案 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);
}

runnable sample

答案 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的更多信息