我是PHP的新手,但通常能够解决大多数问题,但是这个问题得到了我。
我正在尝试使用一个提交按钮创建新闻通讯(单个字段)。我的工作正常,发送电子邮件并将表单数据插入我的表格。但是,我想添加功能以将确认电子邮件发送给注册的人。我已经进行了广泛的研究,我知道这背后的方法,但是我的代码并没有将数据输入用于存储确认信息的第二个表中。
我有2个表:表1命名为"新闻通讯"列为:
idmail,emailaddress,datetime,state
idmail
设置为AUTO_INCREMENT
表2命名为"确认"列为:
idconfirm,emailaddress,confirmkey
这是我的代码(我已经省略了此后的电子邮件部分,因为这一切都可以了):
//connect to database
include('admin/connection.php');
$email = mysqli_real_escape_string($dbc, $_POST['email']);
//check if value exists in table
$result = mysqli_query($dbc, "SELECT emailaddress FROM newsletter WHERE emailaddress = '$email'");
if (mysqli_num_rows($result)==0) {
//Insert value into database
$query1 = mysqli_query($dbc, "INSERT INTO newsletter(emailaddress, datetime, state) VALUES('$email','$now','0')");
mysqli_query($dbc, $query1);
// Get ID of last record
$id = mysqli_insert_id($dbc);
//Create a random key
$hash = $email.date('mY');
$hash = md5($hash);
//Insert value into database
$query2 = mysqli_query($dbc, "INSERT INTO confrim(idconfirm, emailaddress, confirmkey) VALUES('$id','$email','$hash')");
mysqli_query($dbc, $query2);
当我提交电子邮件地址时,第一张表格正确。
此处的目标是将第一个插入中的自动ID获取到变量中,然后在名为" IDConfim"的第二个表列中添加。
我尝试了:
echo $id;
echo $email;
echo $hash;
所有变量都保存正确的信息。
有人有任何想法吗?我已经尝试在这里列出很多东西,但是我已经研究了这一点,但我只是不知道我要在哪里出错。
预先感谢。
我在这里发表评论作为答案:
这里的问题是此$query2 = mysqli_query($dbc,... '$hash')"); mysqli_query($dbc, $query2);
,您应该遇到错误。这是表名称confrim
的可能错字。
您需要在此处删除mysqli_query($dbc, $query2);
并替换为:
if($query2){ echo "Success"; }
else{ echo "Error: " . mysqli_error($dbc);
(另一个编辑):您在此处执行相同的错误:
$query1 = mysqli_query($dbc, "INSERT INTO newsletter ... '$now','0')");
mysqli_query($dbc, $query1);
,需要更改为:
if($query1){ echo "Success"; }
else{ echo "Error: " . mysqli_error($dbc);
Riggsfolly的评论中所述;不要使用MD5进行哈希密码,它不再安全。30多年来,大量的水在桥下奔跑。
使用password_hash()
http://php.net/manual/en/function.password-hash.php和准备好的语句。
编辑:现在看着我再次查看代码后,您不是要保存密码,而是作为确认键。如果是这种情况,那么您可以忽略密码内容。但是,如果您确实决定使用MD5将来存储密码,则不。
问题之一是您不会显示MySQL错误,如果有一个错误。因此,您需要检查服务器日志是否有PHP中的错误,您可以强制将错误打印到错误日志上或执行其他操作:
例如:
mysqli_query($dbc, $query2) or error_log(mysqli_error($dbc));
mysqli_query($dbc, $query2) or custome_error_handler(mysqli_error($dbc));
以及PHP也应将HTTP错误返回给客户端。您应该捕获该错误。
看到SQL错误后,很容易弄清楚您做错了什么。
编辑 Fred II捕获了真正的错误,但我认为错误是第一次犯错误:
mysqli_query($dbc, $query1);
$query1
不是字符串。而且,如果您注意到您已经在上面的行上执行了查询。读取PHP错误日志将完全显示错误的位置。
对不起浪费时间。
感谢jeffery_the_wind将我指向日志。我将来会使用它们。
问题是两个拼写错误,在PHP中的列名中一个,一个在MySQL数据库中。concrim不是一个词!我有点Lexdixlick!
感谢您的及时回复。