PHP - SQL数组插入代码跳过第一个值

时间:2013-03-19 01:12:02

标签: php sql arrays foreach

我开发了一个将变量打印到mysql数据库的函数。

它似乎工作得很好,除了在sql中记录值时会跳过第一个值。但是,所有3个都显示echo命令。换句话说,值1 2和3使用echo打印 - 但只有2和3进入数据库!

$xml = simplexml_load_file($url);

$allcharacters = $xml->xpath('///result/rowset/row/@name');

foreach($allcharacters as $alts) {
    $con=mysqli_connect("localhost","user","password","master");
    $sql="INSERT INTO masterlist (charactername) VALUES ('$alts')";
    mysqli_query($con,$sql);
    echo "Found $alts<br />";

正在插入示例数据:

Found Tiamat's Shadow
Found Troyd23
Found Gore Innovater
Gore Innovater

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

当您将输入插入数据库时​​,您不会清理输入。

第一项'中的Found Tiamat's Shadow会破坏您的SQL查询,因此实际上无法插入;这可以通过你的问题确认“它将跳过第一个值”。

使用MySQLi,您有两种方法可以解决此问题。

首先,您可以使用mysqli_real_escape_string()转义数据:

$con=mysqli_connect("localhost","user","password","master");
foreach($allcharacters as $alts) {
    $alts = mysqli_real_escape_string($con, $alts);
    $sql="INSERT INTO masterlist (charactername) VALUES ('" . $alts . "')";
    ...

使用此功能,任何“不安全”字符在插入数据库时​​都会自动转义。

第二种方法是使用prepared statement。这将需要更多的代码,但是,这样做几乎可以保证你不会忘记偶然做到这一点。这是一个准备好的声明的样本:

$con=mysqli_connect("localhost","user","password","master");
foreach($allcharacters as $alts) {
    $stmt = mysqli_prepare($con, "INSERT INTO masterlist (charactername) VALUES ( ? )");
    mysqli_stmt_bind_param($stmt, "s", $alts);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
    ...

此方法比以前更加健壮,因为它将根据列的数据类型转义数据。它可能比您的特定用例需要的多一点,但是习惯使用预准备语句从不会受到伤害=]