我有一个很长的php脚本,它在linux后端运行,用另一个值来更新数据库。但是在我的循环中它第二次得到未定义的偏移量,当我只使用代码片段进行循环时它工作得很完美,不知道它还能是什么
PHP代码段:
$schema = $con->query("SELECT INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME, users.customers.Name, users.customers.Server from INFORMATION_SCHEMA.SCHEMATA inner join users.customers on INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME=users.customers.Name order by Server asc;");
while( $row = mysqli_fetch_assoc($schema)){
$sResult[] = $row;
}
$sLenght = sizeof($sResult);
$rConnectzaTwo = pg_connect("host=*** dbname=*** user=*** password=***") or die("Could not connect");
$rConnectzaFour = pg_connect("host=*** dbname=*** user=hein password=***") or die("Could not connect");
$rConnectzaFive = pg_connect("host=*** dbname=*** user=*** password=***") or die("Could not connect");
for ($i = 0; $i < $sLenght; $i++) {
$companyName = $sResult[$i]['SCHEMA_NAME'];
if ($sResult[$i]['Server'] == 'ZA02') {
$rConnect = $rConnectzaTwo;
} elseif ($sResult[$i]['Server'] == 'ZA04') {
$rConnect = $rConnectzaFour;
} elseif ($sResult[$i]['Server'] == 'ZA05') {
$rConnect = $rConnectzaFive;
}
PHP编辑代码:
$schema = $con->query("SELECT INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME, users.customers.Name, users.customers.Server from INFORMATION_SCHEMA.SCHEMATA inner join users.customers on INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME=users.customers.Name order by Server asc;");
while( $row = $schema->fetch_assoc()){
$sResult[] = $row;
}
$sLenght = sizeof($sResult);
$rConnectzaTwo = pg_connect("host=*** dbname=*** user=*** password=***") or die("Could not connect");
$rConnectzaFour = pg_connect("host=*** dbname=*** user=hein password=***") or die("Could not connect");
$rConnectzaFive = pg_connect("host=*** dbname=*** user=*** password=***") or die("Could not connect");
for ($i = 0; $i < $sLenght; $i++) {
$companyName = $sResult[$i]['SCHEMA_NAME'];
if ($sResult[$i]['Server'] == 'ZA02') {
$rConnect = $rConnectzaTwo;
} elseif ($sResult[$i]['Server'] == 'ZA04') {
$rConnect = $rConnectzaFour;
} elseif ($sResult[$i]['Server'] == 'ZA05') {
$rConnect = $rConnectzaFive;
}
答案 0 :(得分:0)
你将mysqli面向对象与程序
混合在一起像这样改变
$schema = $con->query("SELECT INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME, users.customers.Name, users.customers.Server from INFORMATION_SCHEMA.SCHEMATA inner join users.customers on INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME=users.customers.Name order by Server asc;");
while($row = $schema->fetch_assoc()){
$sResult[] = $row;
}
答案 1 :(得分:0)
您可以直接清理代码,并在循环结果集之前编写$con_config
查找数组,使其易于管理和阅读。
$con_config=[
'ZA02'=>['host'=>'***','dbname'=>'***','user'=>'***','password'=>'***'],
'ZA04'=>['host'=>'***','dbname'=>'***','user'=>'hein','password'=>'***'],
'ZA05'=>['host'=>'***','dbname'=>'***','user'=>'***','password'=>'***'],
];
if(!$schema=$con->query("SELECT A.SCHEMA_NAME, B.Name, B.Server FROM INFORMATION_SCHEMA.SCHEMATA A INNER JOIN users.customers B ON A.SCHEMA_NAME=B.Name ORDER BY Server ASC;")){
// handle the error as you wish
}else{
while($row=$schema->fetch_assoc()){
if(!isset($con_config[$row['Server']])){
// handle unlisted server value; no connection credentials for this server
}else{
$credentials=$con_config[$row['Server']];
if(!$rConnect=pg_connect("host={$credentials['host']} dbname={$credentials['dbname']} user={$credentials['user']} password={$credentials['password']}"){
// handle the error as you wish: $error = error_get_last(); echo "Connection failed. Error was: ". $error['message']
}else{
// ... continue your script and use $rConnect as you like
}
}
}
}