在php中转义数组索引中的数字

时间:2017-09-09 06:22:30

标签: php arrays

我搜索没有运气,所以如果这是重复的话请告诉我而不是低估。

我有一个游戏服务器脚本,用数据(名称,级别,用户ID和字符类型)填充数据库。

不是每次都删除整个sql表并重新创建它,而是让它检查表中的字符数据并进行比较,只更新不同的内容。一切都很好。

但是,某些字符名称会导致问题。

[09-Sep-2017 02:16:34 America/New_York] PHP Notice: Undefined index: 1OO4 in C:\Scripts\charlist.php on line 56 [09-Sep-2017 02:16:34 America/New_York] PHP Notice: Undefined index: 1zxx in C:\Scripts\charlist.php on line 56

这就是剧本的这一部分:

if ($current[$charName] !== $level) {

其中$current是数据库中已有的所有字符的数组,我将它填充为Name =>水平

字符在数据库中但由于它的抛出错误而没有更新(如上所示)我试图在""中包装$ charName。但它不起作用。

如果有人可以提供建议,我们将不胜感激。

整个脚本供参考,可以看到我在这里修复过的地方。

<?php
$ClanServer = "";
$SodServer = '';
$UID = "";
$PWD = "";
$file = 'C:\account.txt';
$errlog = ini_get('php_errors');
$ConnInfo = array("UID"=>"$UID", "PWD"=>"$PWD", "CharacterSet" => "UTF-8");
$ClanConn = sqlsrv_connect($ClanServer, $ConnInfo);
$SodConn = sqlsrv_connect($SodServer, $ConnInfo);

if (!$SodConn) {
    die('Connection Failed!');
} else {
    echo "Connection Successful!<br />".PHP_EOL;
    $query = "SELECT * FROM soddb.dbo.levellist";
    $result = sqlsrv_query($SodConn, $query, array(), array('Scrollable' => 'buffered'));
    $current = array();
    $files = array();
    while ($row = sqlsrv_fetch_array($result)) {
        $name = $row['CharName'];
        $current["'".$name."'"] = $row['CharLevel'];
    }
    $rootDir = realpath('C:/PT-Server/DataServer/userdata/');
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($rootDir), RecursiveIteratorIterator::SELF_FIRST);
    foreach($objects as $name => $object){
        if (substr($name, -4) == '.dat') {
            $fOpen = fopen($name, "r");
            $fRead = fread($fOpen,filesize($name));
        /*  details  */
            $charLevel = substr($fRead,0xc8,1);
            $charClass = substr($fRead,0xc4,1);
            $charName = trim(substr($fRead,0x10,16),"\x00");
            $charID = trim(substr($fRead,0x2d0,16),"\x00");
            $level = ord($charLevel);
            @fclose($fOpen);
            $files[] = $charName;
            if ($charName == "")
            {
                unlink($name); // Delete char file with no name...
            }

        switch (ord($charClass)){
            case 1: $class = 'Fighter'; break;
            case 2: $class = 'Mechanician'; break;
            case 3: $class = 'Archer'; break;
            case 4: $class = 'Pikeman'; break;
            case 5: $class = 'Atalanta'; break;
            case 6: $class = 'Knight'; break;
            case 7: $class = 'Magician'; break;
            case 8: $class = 'Priestess'; break;
            case 9: $class = 'Assassin'; break;
            case 10: $class = 'Shaman'; break;
            }
        if (in_array("'".$charName."'",array_keys($current))) {
            if ($current["'".$charName."'"] !== $level) {
                $dbentry = "UPDATE soddb.dbo.levellist SET CharLevel='$level',CharClass='$class' WHERE CharName='$charName'";
                $clanupdate = "UPDATE clandb.dbo.ul SET ChLv='$level' WHERE ChName='$charName'";
                $enter = sqlsrv_query($SodConn, $dbentry); 
                sqlsrv_query($ClanConn, $clanupdate);
                if ($enter) {
                    echo "Update $charName, $level successful!<br />".PHP_EOL;  
                }
            }
        } else {
            $dbentry = "INSERT INTO soddb.dbo.Levellist ([ID], [CharName], [CharClass], [CharLevel]) VALUES ('$charID', '$charName', '$class', '$level') ";
            $clanupdate = "UPDATE clandb.dbo.ul SET ChLv='$level' WHERE ChName='$charName'";
            $enter = sqlsrv_query($SodConn, $dbentry); 
            sqlsrv_query($ClanConn, $clanupdate);
            if ($enter) {
                echo "Insert $charName, $level successful!<br />".PHP_EOL;  
            }
        }

        }
    }
    /*  Remove deleted characters  */
    foreach ($current as $k => $v) {
        if (!in_array($k, $files)) {
            $query = "DELETE FROM soddb.dbo.levellist WHERE CharName='$k'";
            sqlsrv_query($SodConn, $query);
        }
    }
    sqlsrv_close($ClanConn);
    sqlsrv_close($SodConn);
}
?>

1 个答案:

答案 0 :(得分:0)

我已经解决了, 我将名称推送到数组($current[$name] = $level;

我用&#39;&#39;它将字符串编号视为一个数字(名称以数字开头)

所以它现在$current["'".$name."'"] = $level;和我做了同样的事情

if (in_array("'".$charName."'",array_keys($current))) {
      if ($current["'".$charName."'"] !== $level) {
           do stuff
      }
}

我现在运行该脚本大约15次进行测试,而且根本没有给出问题。