gpt4 book ai didi

php - 使用 PHP 执行的 MySQL 查询给出不同的结果,执行之间没有任何变化

转载 作者:行者123 更新时间:2023-11-29 03:34:52 24 4
gpt4 key购买 nike

我有以下由 PHP 脚本执行的 MySQL。总而言之,脚本首先清除表“members”。然后它打开一个名为 members.db 的文件并将所有行读入一个数组,然后对于数组中的每一行,它将行拆分为组件并将这些组件中的每一个作为新行插入到“成员”表中.

问题是,每次我执行 PHP 脚本时,有些行不会被插入,而且每次都是一组不同的行。例如,在一次执行中,可能会插入 144 行中的 135 行,而在下一次执行时,将插入 137 行,在下一次执行时,将插入 129 行,等等。未插入的行似乎与一行随机不同执行到下一个,我不会在两者之间进行任何更改。

这可能是什么原因造成的?

mysql_query("DELETE FROM members;");
mysql_query("ALTER TABLE members AUTO_INCREMENT=0;");

$lines = file('cgi-bin/sigphon/members.db', FILE_IGNORE_NEW_LINES);

for ($i=0; $i < count($lines); $i++){

$line = explode(';;', $lines[$i]);

$salt = openssl_random_pseudo_bytes(16);
$password = md5($line[11] . $salt);

$query = " INSERT INTO members (
surname,
names,
home,
affil,
country,
email,
private,
interest,
specialty,
jointime,
password,
salt)
VALUES (
'{$line[1]}',
'{$line[2]}',
'{$line[3]}',
'{$line[4]}',
'{$line[5]}',
'{$line[6]}',
'{$line[7]}',
'{$line[8]}',
'{$line[9]}',
'{$line[10]}',
'{$password}',
'{$salt}'
)";

mysql_query($query);
}

最佳答案

正如上面的评论所暗示的,您没有转义文件文本中的特殊字符。因此,例如任何撇号都会扰乱 SQL 语法。例如,如果某人名叫 O'Reilly,会发生什么情况?

INSERT INTO members (name, ...) VALUES ('O'Reilly', ...)

字符串中的撇号看起来像是结束了字符串,这让 MySQL 感到困惑。

您也没有检查对 mysql_query() 的调用是成功还是失败,因此您不知道有多少错误导致了错误。

始终检查 mysql_query() 的返回值。它返回false 表示错误,然后你应该输出mysql_error()。这是编程 MySQL 时最常见的初学者级错误。

if (mysql_query($query) === false) {
die(mysql_error());
}

要通过转义特殊字符来解决此问题,请阅读 mysql_real_escape_string() 的文档和示例.

正如其他人所说,使用带有查询参数的准备语句也可以解决特殊字符的问题,而无需转义。旧的 ext/mysql API 不支持准备好的语句,这就是它被弃用的原因。

但是为您提供的进一步解决错误并使数据导入速度更快的建议是使用 LOAD DATA INFILE .我测试了以下内容:

mysql> LOAD DATA LOCAL INFILE 'members.db' INTO TABLE members FIELDS TERMINATED BY ';;' 
(surname, names, home, affil, country, email, private, interest, specialty, jointime, password)
SET salt = UNHEX(MD5(RAND())), password = MD5(CONCAT(password, salt));

我也同意其他人的观点,即 MD5 不是散列密码的最佳实践。使用 SHA2()相反。

关于php - 使用 PHP 执行的 MySQL 查询给出不同的结果,执行之间没有任何变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23961643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com