【问题标题】:Trying to validate email field against database to prevent duplciates in contact form尝试针对数据库验证电子邮件字段以防止联系表单中的重复
【发布时间】:2013-02-22 19:34:21
【问题描述】:

我的网站上有一个联系表单,我想防止使用同一电子邮件的用户多次联系。

在存储数据的 mySQL 数据库上,我创建了存储过程

DELIMITER //
CREATE PROCEDURE find_email(emailaddr VARCHAR(60))
BEGIN

DECLARE form_email VARCHAR(60);
SET form_email=emailaddr;

SELECT count(*)
FROM wordpress.cf7dbplugin_submits
WHERE form_name='Register'
AND field_name LIKE '%email%'
AND field_value=form_email;
END //

这样我可以从一个电子邮件地址在数据库中出现的次数中得到一个数字。

在我的 PHP 文件中我这样做了

Global $res;
$res = $mydb->query("CALL find_email");
if($res>0)
{
echo "<script>alert('This email address is already in use!')</script>";
}
else
{
$tableName = $this->getSubmitsTableName();
            $parametrizedQuery = "INSERT INTO `$tableName` (`submit_time`, `form_name`, `field_name`, `field_value`, `field_order`) VALUES (%s, %s, %s, %s, %s)";
            $parametrizedFileQuery = "INSERT INTO `$tableName` (`submit_time`, `form_name`, `field_name`, `field_value`, `field_order`, `file`) VALUES (%s, %s, %s, %s, %s, %s)";
            $order = 0;
            $noSaveFields = $this->getNoSaveFields();
            $foundUploadFiles = array();
            global $mydb;
 }

如果我更改我的代码并手动将 $res 设置为 0,则表单会像预期的那样工作。否则当我点击提交按钮时什么都不会发生。

希望我提供足够的细节,提前感谢任何有解决方案的人。

【问题讨论】:

  • 为什么不向存储过程传递任何参数?不应该是 ("CALL find_email(some_email)") 吗?
  • @tkoomzaaskz 抱歉,您能详细说明一下吗? “some-email”应该是特定的电子邮件吗?
  • 您已经创建了一个带有一个字符串参数的存储过程。当你调用这个存储过程时,你没有传递任何参数,这看起来很偶然。我在想类似的东西: $res = $mydb->query("CALL find_email($some_email)");
  • @tkoomzaaskz "$some_email" 是我输入的字面意思,还是在存储过程中定义?
  • 在 PHP 级别构建动态字符串,您将传递给 MySQL 服务器。放在 "" 字符串中的变量将显示它们的值,而放在 '' 中 - 不会。所以 $some_email = "xyz@example.com" $x = "CALL find_email($some_email)" 将导致 "CALL find_email(xyz@example.com)" 这就是你传递给数据库的内容。

标签: php mysql database stored-procedures contact-form


【解决方案1】:

你把所有这些东西都复杂化了太多。首先,如果你真的不需要,不要在 MySQL 中使用存储过程。相反,请使用纯:

SELECT count(*) FROM table WHERE email LIKE '%value%'

第二。您应该提供表单的 HTML,以便我知道您的 $_POST 变量是什么。例如,如果您的表单如下所示:

<form ...>
  <input type="text" id="mail" name="mail" />
</form>

然后您将使用$_POST['mail'] 访问 PHP 脚本中的电子邮件。

第三。这取决于一个 PHP 脚本/框架控制器是否同时处理显示原始表单(获取)和提交(发布),或者它们是不同的 PHP 脚本/控制器。如果你使用一个文件,它应该是这样的:

if (isset($_POST['email'])) {
  // process - check SQL and eventually display javascript alert
} else  { // get
  // display the form
}

希望对您有所帮助。我建议你阅读一些教程,因为如果你不明白你在问什么,提问可能并不总是有帮助。

【讨论】:

  • 输入的名字是“register-email”
  • 它应该是_而不是-。无论如何,让 PHP 代码看起来像: $db->query("SELECT count(*) FROM table WHERE email LIKE '%$_POST['register_email']%'");
  • 很抱歉,stackoverflow 是一个问答网站,不是论坛。如果您收到 500 错误并且您不检查服务器日志,我将无法为您提供帮助。阅读网络上的基本 PHP 教程并使用更多谷歌,对不起。
  • 如果您仍然关心服务器日志中的内容:[22-Feb-2013 21:49:28 UTC] PHP 解析错误:语法错误,意外 T_ENCAPSED_AND_WHITESPACE,期望 C 中的 T_STRING 或 T_VARIABLE 或 T_NUM_STRING :\inetpub\wwwroot\wordpress\wp-content\plugins\contact-form-7-to-database-extension\CF7DBPlugin.php 在第 522 行
猜你喜欢
  • 2021-08-15
  • 2019-02-02
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
相关资源
最近更新 更多