Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP执行的MySQL查询会给出不同的结果,但在执行之间不会发生任何更改_Php_Mysql - Fatal编程技术网

使用PHP执行的MySQL查询会给出不同的结果,但在执行之间不会发生任何更改

使用PHP执行的MySQL查询会给出不同的结果,但在执行之间不会发生任何更改,php,mysql,Php,Mysql,我有以下由PHP脚本执行的MySQL。总之,脚本首先清除表“members”。然后它打开一个名为members.db的文件并将所有行读取到一个数组中,然后对于数组中的每一行,它将该行拆分为组件,并将这些组件中的每一个作为新行插入到“members”表中 问题是,每次我执行PHP脚本时,有些行不会被插入,而且每次都是一组不同的行。例如,在一次执行中,144行中有135行可能被插入,在下一次执行中,137行将被插入,在下一次执行中,129行,等等。没有插入的行似乎在一次执行到下一次执行时随机变化,我

我有以下由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加密密码是一个非常糟糕的主意,我希望你有一种使用其他东西的方法。请遵循以下步骤以避免危及你的用户。