【问题标题】:mysqli does not save to my databasemysqli 不保存到我的数据库
【发布时间】:2011-03-23 14:00:36
【问题描述】:

我在运行 MySQL 的 PHP 代码方面需要帮助。

对于我在 MySQL 中的存储过程,我有以下内容:

create procedure register ( out userid              int
                           ,in username             varchar(30)
                           ,in unencryptedpassword  varchar(100)
                           ,in description          varchar(100)
                           ,in emailaddress         varchar(100) )
begin
  declare salt char(25);
  declare createdById int;
  declare createdDate datetime;
  declare lastUpdatedById int;
  declare lastUpdatedDate datetime;
  set salt = 'abcdefghijklmnopqrstuvwxy';
  set createdById = -1;
  set createdDate = now();
  set lastUpdatedById = -1;
  set lastUpdatedDate = now();
  insert into Users ( userId
                    , userName
                    , encryptedPassword
                    , description
                    , emailAddress
                    , createdById
                    , createdDate
                    , lastUpdatedById
                    , lastUpdatedDate ) 
             values ( null
                    , username
                    , password(concat(username, salt, unencryptedpassword))
                    , description
                    , emailAddress
                    , createdById
                    , createdDate
                    , lastUpdatedById
                    , lastUpdatedDate );
  set userid = last_insert_id();
  commit;
end;
/

对于我的 register.php 页面,我有以下内容:

<?php
$host="localhost";
$db="mydb";
$uname="myuser";
$pword="mypass";

$firstname=$_POST["firstname"];
$lastname=$_POST["lastname"];
$emailaddress=$_POST["emailaddress"];
$newpassword=$_POST["newpassword"];

$mysqli = new mysqli( $host, $uname, $pword, $db );
$res = $mysqli->multi_query( "call register(@userid,$emailaddress,$newpassword,$firstname,$emailaddress)" );
$mysqli->close();

$_SESSION["sessionId"] = 1;
?>

问题是它永远不会被插入到我的数据库中。谁能帮我解决这个问题。

谢谢。

【问题讨论】:

  • 您是否使用mysqli-&gt;error() 检查错误?此外,当然,为每个用户使用完全相同的盐可以避免首先使用盐的目的,您应该为每个用户随机生成不同的盐。
  • 感谢您的提示。如果我为每个用户生成一个随机盐,那么我也应该将盐保存到表中?
  • 如果你想使用存储的哈希值,我相信你需要这样做,是的。

标签: php mysql mysqli


【解决方案1】:

您使用 multi_query 的原因有哪些?您只执行一个“呼叫”查询。而且它充满了 SQL 注入漏洞,因为您没有转义从 _POST 数组中提取的这 4 个值中的任何一个。

如果调用中的第一个查询失败,mysql_multi_query 返回布尔值FALSE。你应该检查$res

$res = $mysqli->multi_query(...);
if ($res === FALSE) {
   die("Mysql error: " . $mysqli->error);
}

【讨论】:

  • 查询应该是 $res = $mysqli->multi_query("call register(@userid,$emailaddress,$newpassword,$firstname,$emailaddress);select @userid" );但为了简单起见,我暂时把它拿掉了。尝试添加 $mysqli->error。它确实给了我一个错误。 '@yahoo.com,123456,Adhocker,myemail@yahoo.com)' 在第 1 行。编辑了一些值。
  • 通过将其更改为以下内容来修复问题:register(@userid,'$emailaddress','$newpassword','$firstname','$emailaddress')。谢谢大家。
  • 在变量周围加上单引号意味着 PHP 不会将它们视为变量。您应该改用双引号。对于像这样的函数调用,引号是无关紧要的。 func("$a")func($a) 是相同的,除了第一个需要 PHP 创建一个浪费 CPU 周期的一次性字符串。
猜你喜欢
  • 2010-12-04
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2013-12-31
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多