【问题标题】:Populating a database through PHP通过 PHP 填充数据库
【发布时间】:2013-01-01 13:58:12
【问题描述】:

我正在尝试为项目填充数据库。我已经安装了 Xampp,并且正在使用 phpmyadmin 通过 GUI 访问数据库。该数据库有点大,包含评估给定问题的经济替代方案所需的经济因素。 PHP代码:

function _fp($n,$i){
return number_format((pow((1+$i),$n)),5);
}

function _pf($n,$i){
return number_format((1/_fp($n,$i)),5);
}

function _pa($n,$i){
return number_format(((pow((1+$i),$n)-1)/($i*pow((1+$i),$n))),5);
}

function _ap($n,$i){
return number_format((1/_pa($n,$i)),5);
}

function _fa($n,$i){
return number_format(((pow((1+$i),$n)-1)/$i),5);
}

function _af($n,$i){
return number_format((1/_fa($n,$i)),5);
}

function _pg($n,$i){
return number_format(((pow((1+$i),$n)-$i*$n-1)/($i*$i*pow((1+$i),$n))),5);
}

function _ag($n,$i){
return number_format((1/$i-$n/(pow((1+$i),$n)-1)),5);
}

$connection=mysql_connect("localhost","root",'');
if($connection){
$db=mysql_select_db("comp_interest_fact");
if(!$db)
    echo "Failed to select 'comp_interest_fact'.\n";
}
else
echo "Failed to connect to database.\n";

$percentage=array('0_25'=>.0025,
    '0_5'=>.005,
'0_75'=>.0075,
'1'=>.01,
'1_25'=>.0125,
'1_5'=>.015,
'2'=>.02,
'3'=>.03,
'4'=>.04,
'5'=>.05,
'6'=>.06,
'7'=>.07,
'8'=>.08,
'9'=>.09,
'10'=>.1,
'11'=>.11,
'12'=>.12,
'13'=>.13,
'14'=>.14,
'15'=>.15,
'16'=>.16,
'18'=>.18,
'20'=>.20,
'22'=>.22,
'24'=>.24,
'25'=>.25,
'30'=>.3);
reset($percentage);
while(list($key,$value)=each($percentage)){
$table="percent_$key";
for($k=1;$k<=50;$k++){
    $fp=_fp($k,$value);
    $pf=_pf($k,$value);
    $af=_af($k,$value);
    $fa=_fa($k,$value);
    $ap=_ap($k,$value);
    $pa=_pa($k,$value);
    $pg=_pg($k,$value);
    $ag=_ag($k,$value);
    mysql_query("INSERT INTO $table         VALUES($k,".$fp.",".$pf.",".$af.",".$fa.",".$ap.",".$pa.",".$pg.",".$ag.")");
}
}
mysql_close($connection);

这个脚本的问题是,一旦我运行它,comp_interest_fact 中的表并没有全部 50 行。实际上他们应该这样做,因为 for 循环需要 50 次迭代和 50 次 INSERT 操作。我找不到问题。谁能帮帮我?

【问题讨论】:

  • 是否有任何错误?任何mysql错误?你有error reporting 吗?
  • 这里的缩进可以改进不少,这样更容易阅读。外部的reset/while/each 构造作为foreach 语句会更有意义——这就是它的用途!考虑包装您的 SQL 语句,这样您就不必在编辑器中水平滚动。最后尽量避免使用 mysql 函数,因为它们已被弃用。

标签: php mysql phpmyadmin xampp


【解决方案1】:

将插入条件更改为:

 mysql_query("INSERT INTO $table VALUES($k,".$fp.",".$pf.",".$af.",".$fa.",".$ap.",".$pa.",".$pg.",".$ag.")") or die(mysql_error());

或者更好:

mysql_query("INSERT INTO $table VALUES ($k, $fp, $pf, $af, $fa, $ap, $pa, $pg, $ag)") or die(mysql_error());

同时将函数命名为您当前拥有的函数几乎注定任何未来的开发人员都无法处理您的代码。

突出 Hanky Pankys 评论:

In Addition to this suggestion, please also note that this code will produce 1350 INSERT operations and not 50. It will run 50 * 27 Times as per your code

如果您的 $k 是您的主键,那么您将在每次运行时获得覆盖的值。你真的应该有一个 auto inc 键。

【讨论】:

  • 除此建议外,还请注意,此代码将产生 1350 次 INSERT 操作,而不是 50 次。根据您的代码,它将运行 50 * 27 次
  • @Petrograd 如果我将由 $k(主键)表示的列设置为自动增量,而不是插入语句如何更改?
  • @ErvinDervishaj 删除 $k,
  • @Petrogad 删除了 $k。我收到一个错误:“列计数与第 1 行的值计数不匹配”。
猜你喜欢
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2013-04-05
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多