如何防止PHP变量成为数组或对象?

如何防止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

我认为(头衔)是我面临的问题。我建立了一个MySQL连接,读取了一个XML文件,然后通过循环元素将这些值插入到一个表中。问题是,我不是只插入一条记录,而是有时插入2条、3条或4条。这似乎取决于我之前读到的值。我想我正在重新初始化变量,但我想我遗漏了一些东西——希望是一些简单的东西

这是我的密码。我最初有大约20个专栏,但为了便于阅读,我缩短了包含的版本

$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个惩教署