【问题标题】:Mass inserting into an MySQL database via PHP skips names通过 PHP 批量插入 MySQL 数据库会跳过名称
【发布时间】:2011-08-11 12:03:30
【问题描述】:

我目前正在开发一个同时跟踪数百名用户的跟踪程序,但我遇到了一个有点烦人的问题。我让用户插入数据库的方式是通过 html 文本区域,然后我将它们作为参数发送。 60 个人中总有大约 7 个人(也总是同名)被插入到数据库中,但它没有插入正确的数据。我尝试只插入这些用户,一切正常,那么一次插入所有用户会不会有问题?

这是我正在使用的一些代码:
index.html

<head>

    <title>Test</title>

</head>

<body>

    <form name="input" action="tracker.php" method="get">
        <textarea name="names" rows="20" cols="20"></textarea><br>
        <input type="submit" value="Submit" />
    </form>

</body>

tracker.php

$database = mysql_connect("mysql.alwaysdata.com", "stacktest", "stackoverflow");

if (!$database) {
    die('Could not connect to database: ' . mysql_error());
}

mysql_select_db("stacktest_1", $database);

mysql_query("CREATE TABLE stats (username varchar(12), start text, UNIQUE (username))");

$names = explode("\n", $_GET['names']);

if (isset($_GET['track'])) {
    for ($i = 0; $i < count($names); $i++) {
        startTracker($names[$i]);
    }
}

displayData();

function startTracker($username) {
    $stats = getStats($username);
    mysql_query("INSERT IGNORE INTO stats (username, start) VALUES ('" . trim($username) . "', '$stats')");
}

function grabStats($username) {
    $query = mysql_query("SELECT * FROM stats WHERE username LIKE '$username'");
    while ($row = mysql_fetch_array($query)) {
        return $row['start'];
    }
}

function displayData() {
    global $names;
    for ($i = 0; $i < count($names); $i++) {
        $stats = getStats($names[$i]);
        $starting = getStat(grabStats($names[$i]), 2, 0);
        $current = getStat($stats, 2, 0);
        $gained = $currentExperience - $startingExperience;
        echo "Stats for <b>" . $names[$i] . "</b>:<br>";
        echo "Starting experience: " . number_format($starting) . "<br>";
        echo "Current experience: " . number_format($current) . "<br>";
        echo "Gained experience: " . number_format($gained) . "<br><br>";
    }
}

function getStats($username) {
    $curl = curl_init("http://hiscore.runescape.com/index_lite.ws?player=" . $username);
    curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt ($curl, CURLOPT_USERAGENT, sprintf("Mozilla/%d.0", rand(4, 5)));
    curl_setopt ($curl, CURLOPT_HEADER, (int) $header);
    curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt ($curl, CURLOPT_VERBOSE, 1);
    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    $output = curl_exec($curl);
    curl_close ($curl);
    if (strstr($output, "<html><head><title>")) {
        return false;
    }
    return $output;
}

function getStat($stats, $row, $skill) {
    $stats = explode("\n", $stats);
    $levels = explode(",", $stats[$skill]);
    return $levels[$row];
}

mysql_close($database);

您会注意到在数据库中 funkymunky11 没有数据,但显然有来自我从 as you can see 读取的站点的数据。

我还创建了一个数据库,以便您查看发生了什么: http://phpmyadmin.alwaysdata.com/

用户名:stacktest
密码:stackoverflow

以下是我用来测试的名称(我把它放在文本区域内):

永恒
quuxx
funkymunky11
ts danne

如果有一些不需要的代码,我很抱歉,我检查并清理了几乎所有我认为不需要的代码。

提前致谢, 罗恩

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我认为您需要查看插入命令中出现了哪些错误。将以下代码复制到您的 tracker.php 页面,然后更改对 startTracker 的调用,以便它调用 startTrackerDebug。然后看看你得到了什么。请注意,在我的函数中,我使用 sprintf() 和 mysql_real_escape_string() 来确保数据在插入时与 mysql 配合得很好。

      function startTrackerDebug($username) {
        $stats = getStats($username);
        $query = sprintf("INSERT INTO stats (username, start) VALUES('%s', '%s')", 
                          mysql_real_escape_string(trim($username)), 
                          mysql_real_escape_string($stats));
        $result = mysql_query($query);
        if(!$result) echo(mysql_error() . "Query = $query");
      }
    

    【讨论】:

    • 我得到的只是重复的条目消息。我试图从一个文本文件中加载名称,它工作正常,所以它必须是参数或文本区域,对吧?
    • 我刚刚注意到的一件事是 $names = explode("\n", $_POST['names']) 需要 "\r\n" 作为分隔符。显然,它将“\r”附加到用户名上,这使其变长,并且 curl_exec 调用为 funkymunky11 返回 404。
    • 太棒了,我从来没想过!非常感谢:-)
    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2023-03-19
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多