我正在尝试在php中创建一个可以将unix_timestamp保存到mysql数据库中的函数,但我不断收到有关无效参数编号的错误消息。
这是该函数的代码:
function addNew($array){
$sql = 'INSERT INTO USER (id, acronym, name, password)
VALUES (?, ?, ?, UNIX_TIMESTAMP());';
$id = isset($_POST['id']) ? $_POST['id'] : null;
$acronym = isset($_POST['acronym']) ? $_POST['acronym'] : null();
$name = isset($_POST['name']) ? strip_tags($_POST['name']) : null;
$password = isset($_POST['password']) ? strip_tags($_POST['password']) : null;
$params = array($id, $acronym, $name, $password);
$res=$this->db->ExecuteQuery($sql, $array);
if($res) {
$output = 'Användare skapad!';
}
else {
$output = 'Användare kunde tyvärr ej skapas.<br>';
}
return $output;
}
这是用户输入的代码:
$cont = new CUserAdmin($db);
$id = isset($_POST['id']) ? $_POST['id'] : null;
$acronym = isset($_POST['acronym']) ? strip_tags($_POST['acronym']) : null;
$name = isset($_POST['name']) ? strip_tags($_POST['name']) : null;
$password = isset($_POST['password']) ? strip_tags($_POST['password']) : null;
$save = isset($_POST['save']) ? true : false;
$output = null;
if($save){
$array = array($id, $acronym, $name, $salt );
$output = $cont->addNew($array);
}
// Do it and store it all in variables in the belio container.
$belio['title'] = "Ny användare";
$belio['main'] = <<<EOD
<h1>Skapa ny användare</h1>
<form method=post>
<div class="freebox">
<p><label>Acronym <br> <input type='text' name='acronym'/> </label></p>
<p><label>Name:<br> <input type='text' name='name'/> </label></p>
<p><label>Password:<br> <input type='password' name='salt' /> </label></p>
</div>
<p><input type='submit' name='save' value='Spara'/></p>
<p>{$output}</p>
</form>
EOD;
但是代码不起作用,我收到此错误消息:
警告:PDOStatement :: execute():SQLSTATE [HY093]:参数号无效:绑定变量数&gt;与/ home / saxon / students / 20141 / josj14 / www / webflix / belio中的令牌数不匹配/ src目录/的CDatabase 第121行的/CDatabase.php
问题似乎是UNIX_TIMESTAMP本身,当我用'?'交换它时信息将保存到数据库中。
是否可以通过这种方式将unix时间戳保存到数据库?
答案 0 :(得分:0)
这与UNIX_TIMESTAMP()
问题无关,您正在进行不正确的映射。您正在使用$password
映射UNIX_TIMESTAMP()
。
您可能错过了unixdatetime
列...我认为应该是这样的..
$sql = 'INSERT INTO USER (id, acronym, name, password , unixdatetime)
VALUES (?, ?, ?, ?, UNIX_TIMESTAMP());';
当我交换它时,问题似乎是UNIX_TIMESTAMP本身 用&#39;?&#39;信息将保存到数据库中。
当您放置?
它确实有效时,因为您正确地映射了所有内容,您有四列id, acronym, name, password
和四个数组参数,如此处所示.. $params = array( $id, $acronym, $name, $password );
所以你实际做的是你用$password
替换UNIX_TIMESTAMP()
导致无效参数编号:绑定变量数警告。
答案 1 :(得分:0)
您的SQL语句有3个占位符 但是你绑定了数组中的4个参数值 因此也是例外。
$sql = 'INSERT INTO USER ( id, acronym, name, password )
VALUES ( ?, ?, ?, UNIX_TIMESTAMP() );';
$params = array( $id, $acronym, $name, $password );
$res=$this->db->ExecuteQuery($sql, $array);
从数组中删除$password
。
示例:
$sql = 'INSERT INTO USER (id, acronym, name, password )
VALUES ( ?, ?, ?, UNIX_TIMESTAMP() );';
$params = array($id, $acronym, $name );
$res=$this->db->ExecuteQuery( $sql, $array );
如果您正在从userinput读取密码值,请删除unix_timestamp()
并在其中放置占位符。要保存unix_timestamp
,您应该在表格中有另一列来容纳它。说date_time int unsigned
。然后修改insert
,如下所示:
示例:
$sql = 'INSERT INTO USER (id, acronym, name, password, date_time )
VALUES ( ?, ?, ?, ?, unix_timestamp() );';
$params = array($id, $acronym, $name, $password );
$res=$this->db->ExecuteQuery( $sql, $array );
答案 2 :(得分:0)
$sql = 'INSERT INTO USER (id, acronym, name, password)
VALUES (?, ?, ?, UNIX_TIMESTAMP());';
在此处,您可以将时间戳插入密码字段
array($id, $acronym, $name, $password);
在这里输入一个额外的变量,$ password到一个不存在的参数。
$sql = 'INSERT INTO USER (id, acronym, name, password, date_created)
VALUES (?, ?, ?, ?, UNIX_TIMESTAMP());';
可行,将date_created更改为适当的字段名称
另外你应该哈希你的密码,以纯文本形式存储是不好的做法