使用PHP执行的MySQL查询会给出不同的结果,但在执行之间不会发生任何更改
我有以下由PHP脚本执行的MySQL。总之,脚本首先清除表“members”。然后它打开一个名为members.db的文件并将所有行读取到一个数组中,然后对于数组中的每一行,它将该行拆分为组件,并将这些组件中的每一个作为新行插入到“members”表中 问题是,每次我执行PHP脚本时,有些行不会被插入,而且每次都是一组不同的行。例如,在一次执行中,144行中有135行可能被插入,在下一次执行中,137行将被插入,在下一次执行中,129行,等等。没有插入的行似乎在一次执行到下一次执行时随机变化,我不会在这两次执行之间做任何更改 这是什么原因造成的使用PHP执行的MySQL查询会给出不同的结果,但在执行之间不会发生任何更改,php,mysql,Php,Mysql,我有以下由PHP脚本执行的MySQL。总之,脚本首先清除表“members”。然后它打开一个名为members.db的文件并将所有行读取到一个数组中,然后对于数组中的每一行,它将该行拆分为组件,并将这些组件中的每一个作为新行插入到“members”表中 问题是,每次我执行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);
}
mysql\u查询(“从成员中删除;”);
mysql_查询(“ALTER TABLE members AUTO_INCREMENT=0;”;
$lines=file('cgi-bin/sigfon/members.db',file\u IGNORE\u NEW\u行);
对于($i=0;$i<计数($line);$i++){
$line=分解(“;;”,$line[$i]);
$salt=openssl_随机_伪_字节(16);
$password=md5($line[11]。$salt);
$query=“插入到成员中”(
姓,
姓名,
家,
阿菲尔,
国家,,
电子邮件,
私有的
利息,
专业
同时,
密码,
(盐)
价值观(
“{$line[1]}”,
“{$line[2]}”,
“{$line[3]}”,
“{$line[4]}”,
“{$line[5]}”,
“{$line[6]}”,
“{$line[7]}”,
“{$line[8]}”,
“{$line[9]}”,
“{$line[10]}”,
“{$password}”,
“{$salt}”
)";
mysql\u查询($query);
}
正如上面的注释所暗示的,您并没有转义文件文本中的特殊字符。因此,任何撇号都会破坏SQL语法。例如,如果有人叫O'Reilly会怎么样
INSERT INTO members (name, ...) VALUES ('O'Reilly', ...)
字符串中的撇号看起来像是字符串的结尾,这让MySQL感到困惑
您也没有检查对mysql\u query()
的调用是否成功,因此您不知道有多少调用导致了错误
始终检查mysql\u query()
的返回值。它返回false以指示错误,然后您应该输出mysql\u error()
。这是编程MySQL时最常见的初级错误
if (mysql_query($query) === false) {
die(mysql_error());
}
要通过转义特殊字符解决此问题,请阅读文档和示例
正如其他人所说,使用带有查询参数的预处理语句也可以解决带有特殊字符的问题,而无需转义。旧的ext/mysql API不支持预处理语句,因此不推荐使用它
但对您来说,解决错误并使数据导入更快的另一个建议是使用。我测试了以下内容:
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并不是哈希密码的最佳实践。改为使用。使用mysqli和准备好的语句。
for($i=0;$i
最好使用:foreach($line作为$line){
否则,如果索引不存在,您可能会跳过一些。我确信$salt
包含字符(或字节)正如GhostGambler所说,让旧的和不推荐的mysql_*函数隐藏起来,并使用带有占位符的预处理语句(mysqli或PDO)。这将解决您的问题。因为您生成的是伪随机字符串,无法插入的行将不同。对,我想如果我的问题似乎是随机发生的,那么在代码中查找随机变化的行是明智的。我将对此进行调查。MD5加密密码是一个非常糟糕的主意,我希望你有一种使用其他东西的方法。请遵循以下步骤以避免危及你的用户。