Php 特定用户会话的SQL更新
我可以根据会话ID为特定用户添加和删除数据库中的数据,但是,当我尝试更新该特定用户的数据时,会出现错误。该复制键语句也不能正常工作,因为该键被设置为记录ID与股票的符号。有没有办法解决这个问题,因为现在当一个人尝试两次添加相同的股票时,他们可以这样做,所以这会导致以后的问题。对于更新部分,我不确定我现在是否以正确的方式进行更新,因此我非常感谢任何反馈/帮助。谢谢 插入和更新代码:Php 特定用户会话的SQL更新,php,mysql,database,session,Php,Mysql,Database,Session,我可以根据会话ID为特定用户添加和删除数据库中的数据,但是,当我尝试更新该特定用户的数据时,会出现错误。该复制键语句也不能正常工作,因为该键被设置为记录ID与股票的符号。有没有办法解决这个问题,因为现在当一个人尝试两次添加相同的股票时,他们可以这样做,所以这会导致以后的问题。对于更新部分,我不确定我现在是否以正确的方式进行更新,因此我非常感谢任何反馈/帮助。谢谢 插入和更新代码: // When the Buy button is pressed, specific action will be
// When the Buy button is pressed, specific action will be triggered according to the input given.
if(isset($_POST['Buy']))
{
// Checking whether first line is completely filled.
if(empty($_POST['sym1']) or empty($_POST['pri1']) or empty($_POST['q1']))
{
?><h2><center>To add values, please fill out at least the first row completely.</center></h2><?php
// die();
}
// Loop through the form to allow for an appropriate db update.
for($x=1;$x<=4;$x++)
{
$sym = [];
$pri = [];
$q = [];
// If input provided is correct then update the db.
if (!empty($_POST['sym'.$x]) and !empty($_POST['pri'.$x]) and !empty($_POST['q'.$x]))
{
$sym[$x] = $_POST['sym'.$x];
$pri[$x] = $_POST['pri'.$x];
$q[$x] = $_POST['q'.$x];
$memberid = $_SESSION['memberID'];
$sql = "INSERT INTO portfolio2
(stocks_symbol, price, quantity, memberID)
VALUES ('$sym[$x]', $pri[$x], $q[$x], $memberid)
ON DUPLICATE KEY UPDATE
price=$pri[$x], quantity=$q[$x]";
// Check if values are added successfully and if so, then display a message to the user.
if(mysqli_query($conn, $sql))
{
?><h2><center><?php
echo "Stocks added successfully!";
?></h2><center><?php
}
else
{
?><h2><center><?php
echo "Error- Stocks weren't added!". "<br>". $sql.
"<br>". $conn->error;
?></h2><center><?php
}
}
}
mysqli_close($conn);
}
// UPDATE
elseif(isset($_POST['Update']))
{
// Check to see whether the stock symbol has been provided
if(empty($_POST['sym1']))
{
?><h2><center>To update values, please enter the symbol of the stock to be updated.</center></h2><?php
// die();
}
// Loop through the form to allow for an appropriate db update.
for($x=1;$x<=4;$x++)
{
$sym = [];
$pri = [];
$q = [];
// When all three values to be updated are given and are correct, update the db accordingly.
if (!empty($_POST['sym'.$x]) and !empty($_POST['pri'.$x]) and !empty($_POST['q'.$x]))
{
$sym[$x] = $_POST['sym'.$x];
$pri[$x] = $_POST['pri'.$x];
$q[$x] = $_POST['q'.$x];
$memberid = $_SESSION['memberID'];
$sql = "UPDATE portfolio2 SET price=$pri[$x] and quantity=$q[$x] WHERE stocks_symbol='$sym[$x]' and memberid=$memberid";
// Check to see whether the values are updated successfully and if so, then display a message to the user.
if(mysqli_query($conn, $sql))
{
?><h2><center><?php
echo "Stocks updated successfully!";
?></h2><center><?php
}
else
{
?><h2><center><?php
echo "Error- Couldn't update stocks from the table". "<br>". $sql.
"<br>". $conn->error;
?></h2><center><?php
}
}
}
mysqli_close($conn);
}
如果要防止用户两次添加同一股票,可以通过创建唯一索引来实现:
错误消息是什么?将消息附加到问题的底部,而不是作为注释。事实上,我设法消除了错误,更新似乎完成了,但它没有更新任何内容。在db中,无论我的类型和数量保持不变,价格都会更改为0。我从var_dump$sql-string84 UPDATE portfolio中得到的设置价格为3,数量为3,其中stocks_symbol='f'和memberid=22个stocks更新成功!UPDATE语句中的SET子句不正确。设置的字段应该用逗号分隔,而不是和,因此:SET price=$pri[$x]和quantity=$q[$x]。。。相反,应该是:SET price=$pri[$x],quantity=$q[$x],这可能会在表级别涵盖,但您需要将表结构附加到问题的底部。不要添加为另一条注释您可以通过运行SHOW CREATE TABLE portfolio2查询来获取此信息。将输出复制/粘贴到问题的末尾。看起来@Jacobian已经提供了我的下一个答案。继续,接受这样一个事实:如果它对您有效,这确实解决了问题,但前提是我去掉了“ON replicate KEY UPDATE”语句,这很好,谢谢。此外,上面的解决方案实际上允许我更新w/o,而不必使用单独的update语句,但我实际上更喜欢这种方式,所以我将保持现在的状态。再一次,谢谢!
CREATE TABLE `portfolio2` (
`stockID` int(11) NOT NULL AUTO_INCREMENT,
`stocks_symbol` varchar(30) NOT NULL,
`price` decimal(30,2) DEFAULT NULL,
`quantity` int(30) DEFAULT NULL,
`memberid` int(11) NOT NULL,
PRIMARY KEY (`stockID`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1
ALTER TABLE `portfolio2` ADD UNIQUE `unique_idx`(`memberid`, `stocks_symbol`);