我在这里已经阅读了几个线程,但是似乎都没有解决我的问题。我什至尝试了一些代码示例,但它们对我不起作用。
我花了几天的时间试图弄清楚这一点,但到目前为止,我失败了。我不认为这是一个可变范围的问题,但我可能是错的。由于实际的脚本太长而无法发布,因此我仅显示我的逻辑,我希望这足够了。
主要脚本逻辑:
<?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] 删除。
我来说两句