【问题标题】:INSERT INTO not working for 2nd tableINSERT INTO 不适用于第二张桌子
【发布时间】:2016-12-16 14:03:16
【问题描述】:

我是 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;

并且所有变量都包含正确的信息。

有人有什么想法吗? 我已经尝试在此处列出很多内容,但我对此进行了研究,但我只是不知道我哪里出错了。

提前致谢。

【问题讨论】:

  • 首先:INSERT INTO confrim -> INSERT INTO confirm
  • 直接在phpmyadmin上运行查询并查看消息。
  • 只是Spolling IrrorINSERT INTO **confrim**
  • 您没有检查任何 mysqli_ 函数是否有错误 将 ini_set('display_errors', 1); ini_set('log_errors',1); error_reporting(E_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 添加到脚本顶部。这将强制任何mysqli_ 错误生成一个您不能错过或忽略的异常。

标签: php insert-into mysql-insert-id


【解决方案1】:

我在这里发布我的评论作为答案:

这里的问题是这个$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 在 cmets 中所述;不要使用 MD5 来散列密码,它不再安全。 30 多年来,桥下流淌了大量的水。

使用 password_hash() http://php.net/manual/en/function.password-hash.php 和准备好的语句。

编辑: 现在在我看来,再次查看您的代码后,您并没有尝试保存密码,而是更多地作为确认密钥。如果是这种情况,那么您可以忽略密码内容。但是,如果您将来决定使用 MD5 来存储密码,不要这样做。

【讨论】:

  • 错字确认。什么眼睛。 (Y)
  • @NanaPartykar Typo for the table "maybe" ;-) 然而使用 2x mysqli_query() 确实是另一个问题,而且是个大问题。
  • 认为密码哈希不是密码是正确的。膝跳反应....当然重点是jerk
  • @RiggsFolly Meh... 没什么大不了的 ;-) 这是对提及/他们使用 MD5 的正常反应;一个诚实的错误。
【解决方案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 错误日志会准确地告诉你错误在哪里。

【讨论】:

  • “我认为”不是一个答案(我认为,更多的是评论)。再看看他们的代码;我概述了问题所在,但没有提交答案,担心可能出现兔子洞。
  • 这是一个很好的观点,无论如何阅读错误日志会导致程序员遇到您刚刚指出的问题。
  • 您在技术上是正确的,关于使用 mysqli_error() 这显然会引发错误。
【解决方案3】:

抱歉浪费了时间。

感谢 jeffery_the_wind 将我指向日志。我以后会用到它们。

问题是两个拼写错误,一个在 php 的列名中,一个在 mysql 数据库中。确认不是一个词!我有点 lexdixlick!

感谢您的及时回复。

【讨论】:

  • 嗯....不仅如此。你没看到我的回答stackoverflow.com/a/41186319/1415724 吗?自从我的原始帖子以来,我对其进行了一些编辑。恕我直言,您在此处给出的答案并不能真正作为未来访问者的答案。
  • 我也(确实)有阅读障碍,但这并不能阻止我 100% 确定自己没有犯错。
猜你喜欢
  • 2011-02-20
  • 2017-03-20
  • 2022-01-18
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
相关资源
最近更新 更多