尝试从数据库t_awhole中检索信息并将其输入a_whole。我已经阅读了很多这些内容,但找不到我问题的具体内容。
//>>>>Stops here<<<<<
的位置。我使用echo语句来发现它没有通过这一点。最后,我使用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);
}
}
?>
答案 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界面包含 :
功能的原因。