变量值未在foreach循环中的双引号字符串中替换

查尔斯·EF

我在这里已经阅读了几个线程,但是似乎都没有解决我的问题。我什至尝试了一些代码示例,但它们对我不起作用。

我花了几天的时间试图弄清楚这一点,但到目前为止,我失败了。我不认为这是一个可变范围的问题,但我可能是错的。由于实际的脚本太长而无法发布,因此我仅显示我的逻辑,我希望这足够了。

主要脚本逻辑:

<?php
require_once General functions
require_once Validator class
require_once DB table setup

function ForValidationRule()
{
}

if($_POST)
{
 validation rules
 if(validations pass)
 {
  variables set
  foreach(loop thru selected tables to create)
  {
    foreach(loop thru table array to build query)
    {
     $sql .= $data . PHP_EOL;
    }
  }
 }
}
?>

这是我测试期间使用的表数组:

$tbl_names = array
(
 "`id_no` INT NOT NULL AUTO_INCREMENT,",
 "`type_id` CHAR(1) NOT NULL,",
 "`abbrev` VARCHAR(30) NOT NULL,",
 "`description` VARCHAR(75) NULL DEFAULT NULL,",
 "PRIMARY KEY (`id_no` ASC),",
 "UNIQUE INDEX `type_id-abbrev` (`type_id` ASC, `abbrev` ASC))",
 "ENGINE = {$engine}",
 "CHARACTER SET {$charset} COLLATE {$dbcoll}",
 "AUTO_INCREMENT = 2",
 "COMMENT = '{$company} {$tbl_name['names']['full']}';"
);

我遇到的3个变量是:$ engine,$ dbcoll和$ charset。当我在构建查询之前回显变量时,它们是正确的。当我在建立查询后回显变量时,它们是正确的。但这是构建查询的结果:

CREATE TABLE `tester`.`name_pre-suf`(
`id_no` INT NOT NULL AUTO_INCREMENT,
`type_id` CHAR(1) NOT NULL,
`abbrev` VARCHAR(30) NOT NULL,
`description` VARCHAR(75) NULL DEFAULT NULL,
PRIMARY KEY (`id_no` ASC),
UNIQUE INDEX `type_id-abbrev` (`type_id` ASC, `abbrev` ASC))
ENGINE = 
CHARACTER SET  COLLATE 
AUTO_INCREMENT = 2
COMMENT = 'CEF, Inc. Name Prefixes/Suffixes File';

可以看出,查询中所有3个变量均为空白。我使用1个变量$ engine尝试了几种方法,但没有任何效果。

"ENGINE = {${$engine}}"
"ENGINE = " . $engine
'ENGINE = ' . $engine

谁能看到我做错了什么?如果我对值进行硬编码而不是使用变量,则代码可以正常工作。

编辑1:我在原始逻辑示例中犯了一个错误。在进入任何foreach循环之前设置变量。我已经纠正了逻辑样本。这就是我设置这些变量的方式:

$dbhost = $_POST['dbhost'];
$dbuser = $_POST['dbuser'];
$dbpass = $_POST['dbpass'];
$dbname = $_POST['dbname'];
$dbcoll = str_ToLower($_POST['dbcoll']);
$dbcoll_ary = explode("_", $dbcoll);
$charset = trim($dbcoll_ary['0']);
$engine = 'innodb';
if($charset == 'utf8mb4')
{
 $engine = 'innodb ROW_FORMAT=DYNAMIC';
}

这是我在构建查询之前和之后回显的地方。

echo($engine . PHP_EOL);
echo($dbcoll . PHP_EOL);
echo($charset . PHP_EOL);
   $sql = "CREATE TABLE `$dbname`.`{$tbl_name[$key]['db']}`(" . PHP_EOL;
   foreach(${'tbl_' . $key} as $data)
   {
    $sql .= $data . PHP_EOL;
   } // Closing brace for foreach(${'tbl_' . $key} as $data)
echo($engine . PHP_EOL);
echo($dbcoll . PHP_EOL);
echo($charset . PHP_EOL);
echo($sql . PHP_EOL);
exit();

回显的值是正确的,它们是用户选择的值。

编辑2:表名称和表设置是在表文件中定义的,该文件使用require_once命令包含在内。这是我用于测试的表名数组和第一个表数组。

$company = defined('COMPANY_NAME_SHORT') ? COMPANY_NAME_SHORT : '';

$tbl_name = array
(
 'names' => array('db' => 'name_pre-suf', 'full' => 'Name Prefixes/Suffixes File'),
 'tmzn' => array('db' => 'timezones', 'full' => 'Timezones File'),
 'curr' => array('db' => 'currency', 'full' => 'Currency File'),
 'langtyp' => array('db' => 'language_types', 'full' => 'Language Types File'),
 'lang' => array('db' => 'language', 'full' => 'Language File'),
 'cntyp' => array('db' => 'country_types', 'full' => 'Country Types/Sub-Types File'),
 'cntry' => array('db' => 'countries', 'full' => 'Countries'),
 'terri' => array('db' => 'territories', 'full' => 'Territories'),
 'trans' => array('db' => 'translations', 'full' => 'Translations'),
 'langu' => array('db' => 'languages', 'full' => 'Languages'),
 'curry' => array('db' => 'currencies', 'full' => 'Currencies'),
 'dialc' => array('db' => 'dial_codes', 'full' => 'Dialing Codes'),
 'topld' => array('db' => 'tl_domains', 'full' => 'Top Level Domains'),
 'users' => array('db' => 'users', 'full' => 'Users'),
 'usact' => array('db' => 'users_activity', 'full' => 'Users Activity'),
);

$tbl_names = array
(
 "`id_no` INT NOT NULL AUTO_INCREMENT,",
 "`type_id` CHAR(1) NOT NULL,",
 "`abbrev` VARCHAR(30) NOT NULL,",
 "`description` VARCHAR(75) NULL DEFAULT NULL,",
 "PRIMARY KEY (`id_no` ASC),",
 "UNIQUE INDEX `type_id-abbrev` (`type_id` ASC, `abbrev` ASC))",
 "ENGINE = {$engine}",
 "CHARACTER SET {$charset} COLLATE {$dbcoll}",
 "AUTO_INCREMENT = 2",
 "COMMENT = '{$company} {$tbl_name['names']['full']}';"
);

主脚本几乎为600行(包括所有php,html和javascript),而表设置文件(1个表名数组和所有单独的表数组)文件则为300行。我可以附加文件吗?

马科斯·卡萨格兰德

由于这完美地工作:

<?php

$engine = "InnoDB";
$dbcoll = "utf8_general_ci";
$charset = "utf8";

$tbl_names = array
(
 "`id_no` INT NOT NULL AUTO_INCREMENT,",
 "`type_id` CHAR(1) NOT NULL,",
 "`abbrev` VARCHAR(30) NOT NULL,",
 "`description` VARCHAR(75) NULL DEFAULT NULL,",
 "PRIMARY KEY (`id_no` ASC),",
 "UNIQUE INDEX `type_id-abbrev` (`type_id` ASC, `abbrev` ASC))",
 "ENGINE = {$engine}",
 "CHARACTER SET {$charset} COLLATE {$dbcoll}",
 "AUTO_INCREMENT = 2",
 "COMMENT = '{$company} {$tbl_name['names']['full']}';"
);

foreach($tbl_names as $value){
 echo $value .PHP_EOL;
}

?>

我将假设您所有的变量都是空的。检查$charset$engine$dbcoll有asigned它们的值。

编辑:(OP提供的更多信息)

问题是,当您声明数组时,未设置变量

如果在声明数组后拥有变量,则代码将无法按预期工作。

<?php
//This won't work.
$tbl_names = array(/*..*/);

$engine = "InnoDB";
$dbcoll = "utf8_general_ci";
$charset = "utf8";

?>

因此,在声明数组之前先声明变量。

我会推荐这样的东西。

<?php
    //Validate the $_POST for valid values...
    $engine = !empty($_POST["engine"]) $_POST["engine"] ? "InnoDB"; 
    $dbcoll = !empty($_POST["dbcoll"]) $_POST["dbcoll"] ? "utf8_general_ci";
    $charset = !empty($_POST["charset"]) $_POST["charset"] ? "utf8";

    $tbl_names = array(/*..*/);
    //Now $tbl_names will have the correct values. 
    //The default ones, or the user submitted ones

?>

使用您的代码段:

<?php
    $dbhost = $_POST['dbhost'];
    $dbuser = $_POST['dbuser'];
    $dbpass = $_POST['dbpass'];
    $dbname = $_POST['dbname'];
    $dbcoll = str_ToLower($_POST['dbcoll']);
    $dbcoll_ary = explode("_", $dbcoll);
    $charset = trim($dbcoll_ary['0']);
    $engine = 'innodb';

    if($charset == 'utf8mb4'){
        $engine = 'innodb ROW_FORMAT=DYNAMIC';
    }

    //if you set your $tbl_name array here, it will work.
    include("table_names.php");

   $sql = "CREATE TABLE `$dbname`.`{$tbl_name[$key]['db']}`(" . PHP_EOL;
   foreach(${'tbl_' . $key} as $data){
        $sql .= $data . PHP_EOL;
   } // Closing brace for foreach(${'tbl_' . $key} as $data)

?>

问题在于,变量甚至不存在之前就包含了数组,这就是为什么在设置变量之后需要包含文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

变量值未在字符串中更新

来自分类Dev

字符串变量值未在python的subprocess.Popen中显示

来自分类Dev

将变量值替换为字符串

来自分类Dev

将变量值替换为字符串

来自分类Dev

将字符串中的变量名称替换为变量值[R]

来自分类Dev

替换字符串中的单引号和双引号

来自分类Dev

将字符串中的变量值替换为函数调用

来自分类Dev

通过awk / xargs替换定义的字符串中的变量值

来自分类Dev

在双引号之间替换字符串中的字符

来自分类Dev

如何替换perl中双引号中的字符串变量的值

来自分类Dev

使用sed用bash变量替换双引号中的字符串

来自分类Dev

使用JavaScript在字符串中附加变量值

来自分类Dev

动态评估字符串中的变量值

来自分类Dev

使用方案中的字符串获取变量值

来自分类Dev

字符串变量值作为类型中的属性

来自分类Dev

在java中获取字符串的变量值

来自分类Dev

如何替换字符串中的双引号?

来自分类Dev

字符串未在foreach循环中输出

来自分类Dev

从变量中的字符串转义JavaScript中的双引号

来自分类Dev

如何避免在双引号字符串中打印变量

来自分类Dev

用字符串内的双引号替换单引号

来自分类Dev

Powershell用字符串中的单引号替换双引号

来自分类Dev

字符串中的双双引号

来自分类Dev

从字符串中删除双引号

来自分类Dev

无限while循环在Java上将字符串作为while参数传递,变量值不变

来自分类Dev

JS字符串格式化操作-将变量值替换为字符串

来自分类Dev

在循环中保留变量值?

来自分类Dev

更改for循环中的变量值?

来自分类Dev

用于替换双引号字符串中双引号的不同组合的正则表达式

Related 相关文章

热门标签

归档