Php 如何生成令牌并创建要发送到电子邮件的url

Php 如何生成令牌并创建要发送到电子邮件的url,php,mysql,pdo,Php,Mysql,Pdo,我正在为学生注册页面写脚本,学生输入他/她的学生id,如果存在,则检索他/她的电子邮件并生成令牌,将令牌插入数据库,然后将带有令牌和id的注册url链接发送到学生的电子邮件。由于我是php和mysql的初学者,如何获得该链接。 我哪里出了问题 <?php error_reporting(1); session_start(); include 'includes/connect.php'; include 'includes/tokengenerator.p

我正在为学生注册页面写脚本,学生输入他/她的学生id,如果存在,则检索他/她的电子邮件并生成令牌,将令牌插入数据库,然后将带有令牌和id的注册url链接发送到学生的电子邮件。由于我是php和mysql的初学者,如何获得该链接。 我哪里出了问题

<?php
    error_reporting(1);
    session_start();
    include 'includes/connect.php';
    include 'includes/tokengenerator.php';
    if ($_POST["Submit"] == "Submit") {
        $stu_id = $_POST['stu_id'];
        $sql = "SELECT email FROM people WHERE stu_id = :stu_id";
        $stmt = $pdo->prepare($sql);
        $stmt->bindValue(':stu_id', $stu_id);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        if (!empty($result)) {
            $email = $result['email'];
            //echo $email;
            //exit();
            for ($i = 1; $i <= 2; $i++) {
                $token = generateToken();
                //echo $token;
                $email = $result['email'];
                $sql = "INSERT INTO students (token) VALUES ($token) WHERE email = :email";
                $stmt = $pdo->prepare($sql);
                $stmt->execute(array(
                    ':token' => $token,
                ));
                $result1 = $stmt->fetch(PDO::FETCH_ASSOC);
            }
        } else {
            echo 'Please Contact principal for student ID';
        }
    }
?>

您在查询中绑定了错误的值:
:token
vs
:email

实际上应该有两个占位符并绑定这两个值

正如@Saty正确指出的,在
INSERT
语句中不能有
WHERE
子句:

$sql = "INSERT INTO students (token, email) VALUES (:token, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(
     ':token' => $token,
     ':email' => $email
));
或者您可能需要一个
UPDATE
语句而不是
INSERT

$sql = "UPDATE students SET token = :token WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(
     ':token' => $token,
     ':email' => $email
));

您在查询中绑定了错误的值:
:token
vs
:email

实际上应该有两个占位符并绑定这两个值

正如@Saty正确指出的,在
INSERT
语句中不能有
WHERE
子句:

$sql = "INSERT INTO students (token, email) VALUES (:token, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(
     ':token' => $token,
     ':email' => $email
));
或者您可能需要一个
UPDATE
语句而不是
INSERT

$sql = "UPDATE students SET token = :token WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(
     ':token' => $token,
     ':email' => $email
));

使用
updatequery
而不是
insert
我按照你的建议这样做了,但是它抛出了一个语法错误,说WHERE email=?'如何创建一个带有令牌和id的url,并使用phpmailerUse
updatequery
而不是
insert
我按照你的建议那样做了,但是它抛出了一个语法错误,说WHERE email=?“如何创建带有令牌和id的url并使用phpmaileri发送邮件我能够更新令牌,非常感谢,但是我如何使用令牌和id构建url并将url链接发送到该电子邮件?我能够更新令牌,非常感谢,但是我如何使用令牌和id构造URL并将URL链接发送到该电子邮件?