繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM