从一个表检索数据到另一个具有不同列的表

时间:2014-08-06 21:10:19

标签: php mysql sql pdo

尝试从数据库t_awhole中检索信息并将其输入a_whole。我已经阅读了很多这些内容,但找不到我问题的具体内容。

  1. 代码停在我放置评论//>>>>Stops here<<<<<的位置。我使用echo语句来发现它没有通过这一点。
  2. 这是一个电子邮件确认函数,因此t_awhole的表结构与a_whole不同。一切都是相同的,但在t_awhole中,第一列是与该用户相关联的确认码。一旦他们点击他们的电子邮件中的链接,具有该确认代码的行应该将该t_awhole中的所有数据传输到a_whole。但是,它不应该传输确认代码,而应该为行的编号(第一列)添加一个新列作为增量,以及用户是否是管理员(最后一列)。其他所有内容将保持原样(fN,lN,aI,eml,pss)位于第一行和最后一行之间。 请告诉我该怎么做。有人试图在下面,但他的回答很难理解(虽然他尝试了,但我感谢他)。
  3. 最后,我使用PDO作为结构。它最初是用mysql编写的。我注意到使用冒号:而不是货币符号$如何将其从sql切换为PDO?

     <?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= $conn->prepare("INSERT INTO $a_whole_conf(fN, lN, aI, eml, pss, admin) 
                                        VALUES ($fN, $lN, $aI, $eml, $pss, $admin)");
    
    
        //>>>>Stops here<<<<<
                    $result_conf2=$sql_conf2->execute() or die ('Error updating database: '.mysql_error());
                }
    
                // 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);
                }
            }
            ?>
    

1 个答案:

答案 0 :(得分:0)

回答您提出的问题

冒号( : )在SQL文本中用于标识预准备语句中命名绑定参数的占位符。冒号包含在SQL文本中,并且在执行SQL语句时提供该占位符的值。

&#34;钱币&#34;标识PHP变量;在字符串上下文中,计算变量,并将变量的值合并到SQL文本中。


以下是您提出的问题的答案。但我认为这将回答你应该问的其他几个问题......

包含&#34;不安全&#34; PHP变量中的值是&#34; SQL注入&#34;如果我们不保证变量的值不包含一些将被解释为SQL的字符,则会出现漏洞。这正是mysql界面包含 mysql_real_escape_string 功能的原因。这是一个&#34;包装&#34;检查值,并正确转义值,以便它们被视为值,被解释为SQL语法。


问:1。代码停在我放置评论的位置//&gt;&gt;&gt;&gt;停止此处&lt;&lt;&lt;&lt;&lt;&lt;&lt;。

A:酷。我们不清楚您是如何知道代码的,如果您遇到某种错误或其他原因,请停止此处&#34;

我们没有看到任何关于 $admin 变量引用的声明或作业。我们确实看到SELECT要检索列 pss2 。但我们没有看到任何事情要做,除了将其分配给名为 $pss2 的PHP变量,并且它似乎没有在其他任何地方被引用。好奇。


问:2。这是一个电子邮件确认功能,因此t_awhole的表结构与a_whole不同。一切都是相同的,但在t_awhole中,第一列是与该用户相关联的确认码。一旦他们点击他们的电子邮件中的链接,具有该确认代码的行应该将该t_awhole中的所有数据传输到a_whole。但是,它不应该传输确认代码,而应该为行的编号(第一列)添加一个新列作为增量,以及用户是否是管理员(最后一列)。其他所有内容将保持原样(fN,lN,aI,eml,pss)在第一行和最后一行之间。

A:看起来像是一个尴尬的设计。不清楚为什么需要遍历SELECT返回的所有单独行(并且您的代码需要进行SQL注入。希望,&#34; Little Bobby Tables&#34;不会注册。 .. http://xkcd.com/327/

我不确定你为什么不在{34}复制&#34;复制&#34;从一个表到另一个表的行一举,例如:

INSERT .. SELECT

(我没有在原始代码中看到$sql = "INSERT INTO a_whole ( fN , lN, aI, eml, pss, admin) SELECT t.fN, t.lN, t.aI, t.eml, t.pss, '' AS admin FROM t_awhole t WHERE t.confirm_code = '" . mysql_real_escape_string($pk) "'"; 的任何声明或作业,所以我在上面的示例中用文字字符串(零长度)替换了该引用。)

如果您要使用PDO执行此操作,则可以使用带有绑定占位符的预准备语句。所有SQL都是相同的,除了我们用SQL文本中的绑定占位符替换对PHP $admin变量的值的引用:

$pk

现在SQL文本是一个常量字符串,不受SQL注入。

使用PDO,您首先拨打$sql = "INSERT INTO a_whole ( fN , lN, aI, eml, pss, admin) SELECT t.fN, t.lN, t.aI, t.eml, t.pss, '' AS admin FROM t_awhole t WHERE t.confirm_code = :pk"; ,然后拨打prepare()bind_param(),例如

execute()

但是 ...要做到这一点,你需要有一个PDO连接(上面引用$sth = $dbh->prepare($sql); $sth->bindParam(':pk', $pk, PDO::PARAM_INT); $sth->execute(); );你不能使用与PDO的mysql连接。

(如果你没有检查每次调用的结果,你想要在连接上设置错误处理以抛出错误,并使用try / catch块来捕获任何PDOException。)

更新:实际上,我发现你的代码只复制了SELECT返回的第一行,我们看不到我们经常看到的正常$dbh循环。那是我在那里的疏忽,看到了我所期待的东西,但那并不存在。这是我的坏事。仍然,没有必要将值检索到PHP变量中,如果我们要对它们进行所有操作,则将它们插入到另一个表中。让数据库做到这一点,而不是用一堆我们不需要的变量来修改代码。


问:3。最后,我使用PDO作为结构。它最初是用mysql编写的。我注意到冒号:用来代替金钱符号$。为什么这个以及我在哪里切换:代码中的$?

答:编辑中修改的代码现在从已弃用的 mysql 界面调用函数 ; PDO(根据对PDO功能的引用。)

混合mysql接口函数和PDO接口函数无效。您不能在使用mysql接口等获得的连接上使用PDO函数。

这可能是您的代码&#34;停在这里&#34;。

的原因

(我之前有点困惑;我没有看到PDO函数,我看到的只是mysql函数。我们不习惯看到像这样混合的mysql和PDO函数,主要是因为我们从来没有看到这个,因为它无效。)

回答您提出的问题

冒号( while (fetch) )在SQL文本中用于标识预准备语句中命名绑定参数的占位符。冒号包含在SQL文本中,并且在执行SQL语句时提供该占位符的值。

&#34;钱币&#34;标识PHP变量;在字符串上下文中,计算变量,并将变量的值合并到SQL文本中。 (这就是&#34; SQL Injection漏洞的来源......我们不保证该变量的值不包含将被解释为SQL的文本。

这正是mysql界面包含 : 功能的原因。