【问题标题】:PHP Email Confirmation Function MySQL Database errorPHP电子邮件确认功能MySQL数据库错误
【发布时间】:2014-09-20 03:00:54
【问题描述】:

关于 Stackoverflow 上的电子邮件确认、数据库和权限有很多问题,但我找不到任何可以帮助我解决这个问题的问题。

此特定问题针对使用 PHP 构建的电子邮件确认功能。我正在使用的教程可以在这里找到:http://www.phpeasystep.com/phptu/24.html。一切正常,但是当用户单击电子邮件确认链接(这会将他们的信息从temp_table 移动到confirmed_table)时,我收到此错误:

更新数据库时出错:未选择数据库

根据我从不同站点/研究/Stackoverflow 问题收集的信息,这是由于我正在使用的数据库的权限(如果是另一个问题,请纠正我)。我已经读到我需要更改所有用户才能使用READ,但我不确定我是否应该对整个数据库执行此操作(我找不到您是否可以为所有用户设置权限在数据库中自动拥有READ 特权),或者当我将它们添加到temp_table 时的PHP。我上面显示的教程没有说明任何内容,所以我很困惑。

注册表单代码:

<?php
    session_start();

    if(isset($_SESSION['aI']) || isset($_SESSION['pss'])) {
        header("Location: pa.php");
    }

    include 'db.php';

    if(isset($_POST['rSub'])) {
        // connects to database using PHP Data Objects, throws exception if error in connection
        try {
            $conn = new PDO("mysql:host=$svrHost;db=$svrDb", $sUme, $sp);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
            echo "ERROR: " . $e->getMessage();
        }

        $error = '';

        if($_POST['fN'] == '' || $_POST['lN'] == '' || $_POST['aI'] == '' || $_POST['eml'] == '' || $_POST['pss'] == ''
            || $_POST['pss2'] == '') {
            $error = "<li style=\"color:#C70000; font-weight:bold;\"><center>- All fields are required. Try again.</font><center></li>";
        }
        if($error == '') {
            $fN = ucfirst($_POST['fN']);
            $lN = ucfirst($_POST['lN']);
            $aI = $_POST['aI'];
            $eml = $_POST['eml'];
            $pss = $_POST['pss'];
            $pss2 = $_POST['pss2'];
            $admin = 0;


        if($error != '') {
            $error = "<ul>".$error."</ul>";
            $_SESSION['error'] = $error;
        }
        else {
            $hF = "$2y$10$"; // 2y = blowfish and 10 = num of hashes
            $sa = "testsaltforwebsite1219"; //"random" 22-character sa
            $fAS = $hF.$sa;
            $sha = crypt($pss, $fAS);
            // Random confirmation code
            $c_cd=md5(uniqid(rand()));

            $insert = $conn->prepare("INSERT INTO t_awhole (c_cd, fN, lN, aI, eml, pss) 
                    VALUES (:c_cd, :fN, :lN, :aI, :eml, :pss)");

            $insert->bindParam(':c_cd', $c_cd);
            $insert->bindParam(':fN', $fN);
            $insert->bindParam(':lN', $lN);
            $insert->bindParam(':aI', $aI);
            $insert->bindParam(':eml', $eml);           
            $insert->bindParam(':pss', $sha);
            $result=$insert->execute();

            // ---------------- Confirmation email ---------------- \\
            // table name 
            $t_apart=t_awhole;

            if($result){

            // send e-mail to ...
            $to=$eml;

            // Your subject
            $subject="Registration Confirmation";

            // From
            $header="from: no-reply@example.com"; //Need the address to send the eml to.

            // Your message
            $message="Copy and paste this link in your browser to activate your account: \r\n";
            $message.="\n";
            $message.="(serverAddress)/confirmation.php?passkey=$c_cd \r\n";
            $message.="\n";
            $message.="Thank you";

            // send eml
            $sml = mail($to,$subject,$message,$header);
            }

            // if not found
            else {
            echo "Your email Is Not Registered.  Please Register.";
            }

            // if your email succesfully sent
            if($sml){
            echo '<script> window.location.href="emlC.php"</script>';
            }

            else {
            echo "Cannot Send Confirmation Link To Your email Address.";
            }
            // ---------------- Confirmation email ---------------- \\
            $_SESSION['aI'] = $aI;
            $_SESSION['pss'] = $pss;
            $_SESSION['admin'] = 0;

            $stmt = $conn->prepare("SELECT DISTINCT dN, dU, ex FROM doc WHERE aI != '0'");
            $stmt->execute();

            $result = $stmt->fetchAll();
            foreach ($result as $row)
            {

                $ex = $row['ex'];
                $dU = $row['dU'];
                $dN = $row['dN'];


                $insert = $conn->prepare("INSERT INTO doc (dN, dU, aI, ex)
                        VALUES (:dN, :dU, :aI, :ex)");


                $insert->bindParam(':aI', $aI);
                $insert->bindParam(':ex', $ex);
                $insert->bindParam(':dU', $dU);
                $insert->bindParam(':dN', $dN);

                $insert->execute();

            }
        }
    }
?>

确认页面代码:

<?php

include('db.php');

// passkey that got from link
$pk=$_GET['pk'];
$t_awhole_conf="t_awhole";

// Retrieve data from table where row that match this passkey
$sql_conf1="SELECT * FROM $t_awhole_conf WHERE confirm_code ='$pk'";
$result_conf=mysql_query($sql_conf1) or die ('Error updating database: '.mysql_error());


// If successfully queried
if($result_conf){
    // Count how many row has this passkey
    $count=mysql_num_rows($result_conf);

        // if found this passkey in our database, retrieve data from table "t_awhole"
        if($count==1){

            $rows=mysql_fetch_array($result_conf);
            $fN = $rows['fN']; // capitalizes the first letter (6-26-14)
            $lN = $rows['lN']; // capitalizes the first letter (6-26-14)
            $aI = $rows['aI'];
            $eml = $rows['eml'];
            $pss = $rows['pss'];
            $pss2 = $rows['pss2'];

            $a_whole_conf="a_whole";

            // Insert data that retrieves from "t_awhole" into table "a_whole"
            $sql_conf2="INSERT INTO $a_whole_conf(fN, lN, aI, eml, pss, admin) 
                                VALUES ($fN, $lN, $aI, $eml, $pss, $admin)";
            $result_conf2=mysql_query($sql_conf2);
        }

        // if not found passkey, display message "Wrong Confirmation code"
        else {
            echo "Wrong Confirmation code";
        }

        // if successfully moved data from table"t_awhole" to table "a_whole" displays message "Your account has been activated" and don't forget to delete confirmation code from table "t_awhole"
        if($result_conf2){

            echo "Your account has been activated";

            // Delete information of this user from table "t_awholeb" that has this passkey
            $sql_conf3="DELETE FROM $t_awhole_conf WHERE confirm_code = '$pk'";
            $result_conf3=mysql_query($sql_conf3);
        }
    }
?>

【问题讨论】:

  • 你是如何初始化你的数据库连接的?请出示代码
  • 旁注:该教程很旧,过时并且对 SQL 注入开放(大时代)。我建议您使用带有准备好的语句的mysqli_ 找到其他内容,或者将其转换为mysqli_,同时确保在使用正确/安全的散列算法时将密码存储为纯文本。如果您按原样使用该教程,那么被黑客入侵只是时间问题。你被告知了。
  • @Fred-ii- 对。正在降低基本功能,然后在它工作后开始安全工作。
  • @Alex 我用代码更新了这个问题。认为没有必要,因为我问的是一个更笼统的问题。
  • 这是必要的,因为这是您选择正在使用的数据库的点。如果您从一个数据库移动到另一个数据库,您将需要在使用之前选择另一个数据库。或者在您的插入查询中引用其全名:database.table

标签: php mysql database error-handling


【解决方案1】:

在您的注册表单代码中,您有两行创建与数据库的连接(新 PDO ...)。您可以进一步使用 $conn 来执行语句。

在您的确认代码中,您在调用 mysql_query 之前没有创建任何连接(为什么要从 PDO 切换到 mysql 函数?)。

请参阅 mysql_query 文档here

【讨论】:

  • 好的。你会建议做什么?我是按照我在问题中发布的指南这样做的。
  • 我的第一反应是完全更改一个文件或另一个,选择要使用 PDO(注册文件)还是 mysql(确认文件)。我会选择 PDO,因为在 PHP 5.5.0 (php.net/manual/en/intro.mysql.php) 中不推荐使用另一个。
  • 相反,如果您只想让它快速工作,我认为您只需错过确认文件中的“连接”行即可成功。类似 mysql_connect(host, user, pass),然后是 mysql_select_db(db)。在此处查看 mysql 函数:php.net/manual/en/book.mysql.php.
猜你喜欢
  • 2016-11-25
  • 2013-04-23
  • 2017-02-01
  • 1970-01-01
  • 2018-06-15
  • 2014-02-15
  • 2014-04-30
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多