如何防止PHP变量成为数组或对象?
我认为(头衔)是我面临的问题。我建立了一个MySQL连接,读取了一个XML文件,然后通过循环元素将这些值插入到一个表中。问题是,我不是只插入一条记录,而是有时插入2条、3条或4条。这似乎取决于我之前读到的值。我想我正在重新初始化变量,但我想我遗漏了一些东西——希望是一些简单的东西 这是我的密码。我最初有大约20个专栏,但为了便于阅读,我缩短了包含的版本如何防止PHP变量成为数组或对象?,php,mysql,simplexml,Php,Mysql,Simplexml,我认为(头衔)是我面临的问题。我建立了一个MySQL连接,读取了一个XML文件,然后通过循环元素将这些值插入到一个表中。问题是,我不是只插入一条记录,而是有时插入2条、3条或4条。这似乎取决于我之前读到的值。我想我正在重新初始化变量,但我想我遗漏了一些东西——希望是一些简单的东西 这是我的密码。我最初有大约20个专栏,但为了便于阅读,我缩短了包含的版本 $ctr = 0; $sql = "insert into csd (id,type,nickname,hostname,username,p
$ctr = 0;
$sql = "insert into csd (id,type,nickname,hostname,username,password) ".
"values (?,?,?,?,?,?)";
$cur = $db->prepare($sql);
for ($ctr = 0; $ctr < $expected_count; $ctr++) {
unset($bind_vars,$dat);
$lbl = "csd_{$ctr}";
$dat['type'] = (string) $ref->itm->csds->$lbl->type;
$dat['nickname'] = (string) $ref->itm->csds->$lbl->nickname;
$dat['hostname'] = (string) $ref->itm->csds->$lbl->hostname;
$dat['username'] = (string) $ref->itm->csds->$lbl->username;
$dat['password'] = (string) $ref->itm->csds->$lbl->password;
$bind_vars = array( $id,$dat['$type'], $dat['$nickname'], $dat['$hostname'],
$dat['$username'], $dat['$password']);
print_r ($bind_vars);
$res = $db->execute($cur, $bind_vars);
}
更新:我根据建议更改了代码,现在它并不总是相同的模式,但它同样被破坏。当我在插入之前显示绑定数组时,它看起来是这样的。请注意,我还计算了前后的行数,因此有0行,然后我插入1,然后有2行:
0 CSDs on that ITEM now.
Array
(
[0] => 2
[1] => 0
[2] =>
[3] => X
[4] => XYZ
[5] =>
[6] =>
[7] =>
[8] => audio
[9] =>
[10] => 192.168.0.50
[11] => 192.168.0.3
[12] => 255.255.255.0
[13] => 255.255.255.0
[14] =>
[15] =>
[16] =>
[17] => 21
[18] => 5
[19] => Y
[20] => /dir
)
2 CSDs on that ITEM now.
不确定确切答案,但这可能会有所帮助
$ctr = 0;
$sql = "insert into csd (id,type,nickname,hostname,username,password) ".
"values (?,?,?,?,?,?)";
$cur = $db->prepare($sql);
for ($ctr = 0; $ctr < $expected_count; $ctr++) {
//list ( $lbl, $type, $nickname, $hostname, $username, $password) = "";
//$bind_vars = array();
// use unset
unset($bind_vars,$dat);
$lbl = "csd_{$ctr}";
$dat['type'] = $ref->itm->csds->$lbl->type;
$dat['nickname'] = $ref->itm->csds->$lbl->nickname;
$dat['hostname'] = $ref->itm->csds->$lbl->hostname;
$dat['username'] = $ref->itm->csds->$lbl->username;
$dat['password'] = $ref->itm->csds->$lbl->password;
$bind_vars = array($id,$dat['$type'],$dat['$nickname'],$dat['$hostname'],$dat['$username'],$dat['$password']);
$res = $db->execute($cur, $bind_vars);
# this is a separate function which works, but which only
# does SELECTS and cannot be the problem. I include it because I
# want to count the total rows.
printf ("%d CSDs on that ITEM now.\n", CountCSDs($id_to_sync));
}
$ctr=0;
$sql=“插入csd(id、类型、昵称、主机名、用户名、密码)”。
“值(?,,,,,,,?)”;
$cur=$db->prepare($sql);
对于($ctr=0;$ctr<$expected_count;$ctr++){
//列表($lbl、$type、$昵称、$hostname、$username、$password)=“”;
//$bind_vars=array();
//使用unset
未设置($bind_vars,$dat);
$lbl=“csd{$ctr}”;
$dat['type']=$ref->itm->CSD->$lbl->type;
$dat['昵称]=$ref->itm->CSD->$lbl->昵称;
$dat['hostname']=$ref->itm->csds->$lbl->hostname;
$dat['username']=$ref->itm->csds->$lbl->username;
$dat['password']=$ref->itm->csds->$lbl->password;
$bind_vars=数组($id、$dat['$type']、$dat['$昵称']、$dat['$hostname']、$dat['$username']、$dat['$password']);
$res=$db->execute($cur,$bind_vars);
#这是一个单独的函数,它可以工作,但只
#是的,不可能是问题。我包括它是因为我
#要计算总行数。
printf(“%d个CSD现在在该项目上。\n”,countCSD($id_to_sync));
}
或者您应该先检查/echo
$expected\u count
值以确定正确的计数不确定确切答案,但这可能会有所帮助
$ctr = 0;
$sql = "insert into csd (id,type,nickname,hostname,username,password) ".
"values (?,?,?,?,?,?)";
$cur = $db->prepare($sql);
for ($ctr = 0; $ctr < $expected_count; $ctr++) {
//list ( $lbl, $type, $nickname, $hostname, $username, $password) = "";
//$bind_vars = array();
// use unset
unset($bind_vars,$dat);
$lbl = "csd_{$ctr}";
$dat['type'] = $ref->itm->csds->$lbl->type;
$dat['nickname'] = $ref->itm->csds->$lbl->nickname;
$dat['hostname'] = $ref->itm->csds->$lbl->hostname;
$dat['username'] = $ref->itm->csds->$lbl->username;
$dat['password'] = $ref->itm->csds->$lbl->password;
$bind_vars = array($id,$dat['$type'],$dat['$nickname'],$dat['$hostname'],$dat['$username'],$dat['$password']);
$res = $db->execute($cur, $bind_vars);
# this is a separate function which works, but which only
# does SELECTS and cannot be the problem. I include it because I
# want to count the total rows.
printf ("%d CSDs on that ITEM now.\n", CountCSDs($id_to_sync));
}
$ctr=0;
$sql=“插入csd(id、类型、昵称、主机名、用户名、密码)”。
“值(?,,,,,,,?)”;
$cur=$db->prepare($sql);
对于($ctr=0;$ctr<$expected_count;$ctr++){
//列表($lbl、$type、$昵称、$hostname、$username、$password)=“”;
//$bind_vars=array();
//使用unset
未设置($bind_vars,$dat);
$lbl=“csd{$ctr}”;
$dat['type']=$ref->itm->CSD->$lbl->type;
$dat['昵称]=$ref->itm->CSD->$lbl->昵称;
$dat['hostname']=$ref->itm->csds->$lbl->hostname;
$dat['username']=$ref->itm->csds->$lbl->username;
$dat['password']=$ref->itm->csds->$lbl->password;
$bind_vars=数组($id、$dat['$type']、$dat['$昵称']、$dat['$hostname']、$dat['$username']、$dat['$password']);
$res=$db->execute($cur,$bind_vars);
#这是一个单独的函数,它可以工作,但只
#是的,不可能是问题。我包括它是因为我
#要计算总行数。
printf(“%d个CSD现在在该项目上。\n”,countCSD($id_to_sync));
}
或者,您应该首先检查/echo
$expected\u count
值以确定正确的计数结果表明,脚本是由一个cron作业运行的,而其他人正在用另一个cron作业运行我的脚本,因此它有时创建的记录是原来的两倍,有时则不是。我看得越多,为解决问题而编写的代码越多,速度就越慢,所以情况就越糟
换句话说,当我不看它时,它比我看它时工作得更好
该死那些想帮我的人 结果表明,脚本是由一个cron作业运行的,但其他人正在用另一个cron作业运行我的脚本,因此它有时会创建两倍的记录,有时则不是。我看得越多,为解决问题而编写的代码越多,速度就越慢,所以情况就越糟 换句话说,当我不看它时,它比我看它时工作得更好
该死那些想帮我的人 输出应该是什么&错误在哪里?执行
打印($bind_vars)
并检查数组是否正确。我最初的想法是,如果我可以将这些变量声明为整数和字符串,我就不会因为向它们添加了另一个值而自动将它们变为数组。但同样,我可能遗漏了一些东西。@apis17:没有实际的输出,但是一个包含2条记录的XML文件应该会导致插入2条记录。它导致4。一个包含5条记录的文件插入10条记录。但有时2条XML记录会导致3条数据库记录。并且没有错误消息;这是它生成的调试输出:现在该项上有1个CSD。现在有3名CSD负责该项目。现在该项目有5个CSD。现在有6名CSD负责该项目。8个CSD现在处理该项目。现在该项上有10个CSD。输出应该是什么?错误在哪里?执行print\r($bind\u vars)
并检查数组是否正确。我最初的想法是,如果我可以将这些变量声明为整数和字符串,我就不会因为向它们添加了另一个值而自动成为数组。但同样,我可能遗漏了一些东西。@apis17:没有实际的输出,但是一个包含2条记录的XML文件应该会导致插入2条记录。它导致4。一个包含5条记录的文件插入10条记录。但有时2条XML记录会导致3条数据库记录。并且没有错误消息;这是它生成的调试输出:现在该项上有1个CSD。现在有3名CSD负责该项目。现在该项目有5个CSD。现在有6名CSD负责该项目。8个CSD现在处理该项目。10个惩教署