【问题标题】:MySQL INSERT IGNORE Not working for my 7dtd server scriptMySQL INSERT IGNORE 不适用于我的 7dtd 服务器脚本
【发布时间】:2014-10-17 14:16:15
【问题描述】:

我的表是用这个创建的。

CREATE TABLE `Player` (
`id` int(11) NOT NULL auto_increment,
`playername` varchar(255) NOT NULL,
`SteamID` varchar(255) NOT NULL,
`position` varchar(255) NOT NULL,
`lastlogin` varchar(255) NOT NULL,
`approved` varchar(255) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

我正在尝试将新字段插入列而不覆盖其他字段。完整的脚本通过 FTP 下载一个 player.xml,然后将一个玩家 Steam64ID 转换为用户 SteamName,然后如果 Steam64ID 不在数据库中,它假设插入到 mysql 数据库中。

$xml = simplexml_load_file("players.xml");
foreach($xml->children() as $player)
{
    $id = $player->attributes()->id;
    $profile = new SteamProfile($id);
    $name = $profile->getUsername();
    $lastlogin = $player->attributes()->lastlogin;
    $position = $player->lpblock->attributes()->pos;
    $sql1= "INSERT IGNORE INTO Player (playername, SteamID, position, lastlogin, approved) VALUES ('$name', '$id', '$position', '$lastlogin', '$approve')";
    if (!mysql_query($sql1,$connection))
    {
            die('Insert Error: ' . mysql_error());
    }
}

我尝试的所有操作都会返回同样的错误。

Insert Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'm L', '76561198108930923', '', '8/23/2014 7:47:36 PM', '')' at line 1

这是减去连接信息的完整代码,是的,我知道它有多糟糕,这就是我寻求帮助的原因。我也是 100% 新的 mysql 和 php。

class SteamProfile
{
    const STEAMAPI_URL_MASK = 'http://steamcommunity.com/profiles/%s/?xml=1';
    const UNKONWN_NAME_MASK = 'User #%s (Username Not Found)';
    private $steamId;
    private $xml;
    public function __construct($steamId){
        $this->steamId = $steamId;
    }
    public function getUsername(){
        $xml = $this->getXml($this->steamId);
        return $xml->steamID ? (string)$xml->steamID : sprintf(self::UNKONWN_NAME_MASK, $this->steamId);
    }
    private function getXml($steamId){
        if ($this->xml){
            return $this->xml;
        }
        $url = sprintf(self::STEAMAPI_URL_MASK, $steamId);
        if (!$xml = simplexml_load_file($url)){
            throw new UnexpectedValueException(sprintf('Unable to load XML from "%s"', $url));
        }
        return $this->xml = $xml;
    }
}
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) 
{
    echo "Successfully loaded $local_file\n<br />";
} 
else 
{
    echo "There was a problem\n.<br />";
}
ftp_close($conn_id);
$connection = mysql_connect("$hostname","$data_username","$data_password") or die ("Couldn't connect to server.");
$db = mysql_select_db("$db_name", $connection) or die("Couldn't select database.");
$xml = simplexml_load_file("players.xml");
foreach($xml->children() as $player)
{
    $id = $player->attributes()->id;
    $profile = new SteamProfile($id);
    $name = $profile->getUsername();
    $lastlogin = $player->attributes()->lastlogin;
    $position = $player->lpblock->attributes()->pos;
    $sql1= "INSERT IGNORE INTO Player (playername, SteamID, position, lastlogin, approved) VALUES ('$name', '$id', '$position', '$lastlogin', '$approve')";
    if (!mysql_query($sql1,$connection))
    {
            die('Insert Error: ' . mysql_error());
    }
}
sleep(2);
echo "Successfully inserted information to database<br />";
if(isset($_POST['update']))
{
    $steam = $_POST['steam'];
    $approved = $_POST['approved'];
    mysql_query ("UPDATE Player SET approved='$approved' WHERE SteamID = '$steam'");
    if(! $connection )
    {
        die('Could not connect: ' . mysql_error());
    }
    echo'<br />Updated ('.$steam.') into the database successfully.<br />';
}
else
{
}
$mysql = mysql_query("SELECT playername, SteamID, position, lastlogin, approved FROM Player WHERE position IS NOT NULL AND TRIM(position) <> '' AND approved = ''");
while($row = mysql_fetch_array($mysql))
        {
            echo '<br /><table><tr><td>
            Player Name: '.$row['playername'].'<br />
            SteamID: '.$row['SteamID'].'<br />
            Keystone Location: '.$row['position'].'<br />';
            echo 'Admin Approved: ';
            if (isset($row['position']) && ($row['approved'] != "Yes"))
            {
                echo 'No</td></tr></table>';
            }
            else
            {
                echo 'Yes</td></tr></table>';
            }
        }
mysql_close($connection);
?><br />
<form method="post" action="<?php $_PHP_SELF; ?>">
    <table width="400" border="0" cellspacing="1" cellpadding="2">
    <tr><td width="100">Type SteamID</td><td><input name="steam" type="text" id="steam"></td></tr>
    <tr><td width="100">Yes or No</td><td><input name="approved" type="text" id="approved"></td></tr>
    <tr><td width="100"></td><td></td></tr>
    <tr><td width="100"></td><td><input name="update" type="submit" id="update" value="Approve"></td></tr></table></form>

【问题讨论】:

  • 看起来不错。为什么不回显整个查询,在 mySql 客户端中执行,看看是否有问题(而且看起来不明显)。
  • 对不起,但就像我说的我也是新的 mysql 和 php 所以我不太明白你在 mysql 客户端中执行的意思?哪个客户?

标签: mysql database insert duplicates


【解决方案1】:

玩家姓名很可能包含单引号,MySQL 将其视为值分隔符。

在插入数据库之前通过mysql-real-escape-string运行名称:

$name = mysql-real-escape-string($profile->getUsername());

顺便说一句,请注意mysql_ 方法已被弃用,您确实应该使用mysqliPDO

【讨论】:

  • $position 输出值,例如 -222,62,1103,$name 输出一些名称,例如 德玛西亚 和 [66ff00]â~£ Nekhrun â~£ 所以我猜测它可能是名称,但是当添加 $name = mysql_real_escape_string($profile-&gt;getUsername()); 时,它会插入到数据库中,但会不停地加载页面,并且还会插入重复项。更不用说以某种方式弄乱了我的页面 css。
  • 看起来像字符编码问题。不知道脚本的其余部分出了什么问题。
  • 好吧,环顾四周,似乎有一个 $name 回来了,因为我是 L,单引号正在抛出整个事情。我尝试了两件事。一个是在脚本的顶部,我添加了函数public function __toString() { return sprintf("%s (SteamID: %s)", $this-&gt;getUsername(), $this-&gt;steamId); },还使用了$name = mysql_real_escape_string($profile-&gt;getUsername());,现在它几乎可以正常工作,它仍在向数据库中插入重复项,我需要它仅在 $id 不存在时插入.
【解决方案2】:

在得到 Robby 的帮助后,我得到了正确的字符串,然后我被困在 INSERT IGNORE 不发送重复项,半睡半醒我想我只是忘了使列 SteamID 唯一。因此,擦除数据库并一遍又一遍地运行,现在似乎一切正常。感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 2013-04-12
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2013-03-16
    • 2020-06-23
    相关资源
    最近更新 更多