我是PHP的新手,但通常能够解决大多数问题,但是这个问题已经解决了。
我尝试使用单个提交按钮创建简报注册(单个字段)。我有这个工作正常,发送电子邮件并将表单数据插入我的表。但是,我想添加功能,以便向注册的人发送确认电子邮件。我已经做了大量的研究,我知道这背后的方法,但我的代码只是没有将数据输入到用于存储确认信息的第二个表中。
我有2张桌子: 表1命名为' newsletter'列是:
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);
当我提交电子邮件地址时,第一个表格会正确填充。
这里的目标是将第一个INSERT INTO查询中创建的自动ID转换为变量,然后将其添加到名为' idconfim'的第二个表列中。
我试过了:
echo $id;
echo $email;
echo $hash;
并且所有变量都包含正确的信息。
有没有人有任何想法? 我已经尝试过很多东西在这里列出,但是我已经研究了这个,我只是不知道我哪里出错了。
提前致谢。
答案 0 :(得分:5)
我在这里发表评论作为答案:
这里的问题是这个$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存储密码,请不要。
答案 1 :(得分:2)
其中一个问题是你没有显示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错误日志将准确显示错误的位置。
答案 2 :(得分:-3)
抱歉浪费时间。
感谢jeffery_the_wind指向我的日志。我将来会用它们。
问题是两个拼写错误,一个在php的列名中,另一个在mysql数据库中。 confrim不是一个字!我有点lexdixlick!
感谢您的及时回复。