0

我开发了一个将变量打印到 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

有什么建议么?

4

1 回答 1

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 . "')";
    ...

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

第二种方法是使用准备好的语句。这将需要更多的代码,但是,这样做几乎总是可以保证您不会意外忘记这样做。这是一个带有准备好的语句的示例:

$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);
    ...

这种方法比以前的方法更加健壮,因为它会根据列的数据类型转义数据。它可能比您的特定用例所需的要多一点,但是养成使用准备好的语句的习惯永远不会有坏处=]

于 2013-03-19T02:39:14.797 回答