【问题标题】:Correctly accessing entire row for database insertion with mysqli & PHP使用 mysqli 和 PHP 正确访问整行以进行数据库插入
【发布时间】:2019-04-11 19:45:53
【问题描述】:

我正在开展一个项目,我们使用数据库向用户发送消息。在这个 php 文件中,我使用 to、from、date 和 message 字段插入到数据库中。目标是向某个公司内的所有人发送相同的信息。但是,当我尝试发送它时,消息有时不会发送,当它发送时,它只会向我从数据库中获取的组/行中的第一个联系人发送消息。我在网上看到过其他例子,但到目前为止,我还没有看到其他人有这个确切的问题。任何建议将不胜感激。

$sql = 'SELECT drivers.username FROM project.drivers WHERE drivers.sponsor="'.$_SESSION["company"].'"'; //query to get all driver usernames within one company
$result = $conn->query($sql);
//$row = mysqli_fetch_array($result);
while($row = mysqli_fetch_array($result)){ //iterating throughout all the drivers
    $to  = $row["username"]; //username of current driver
    $from = $_SESSION["username"]; //from current company
    $message = $_SESSION["username"] . " updated your point to dollar ratio. Your new point to dollar ratio is " . $_SESSION["pointRatio"] . "."; //message
    $sql2 = "INSERT INTO project.messages(messages.date, messages.to, messages.from, messages.message) VALUES(now(), '".$to."', '".$from."', '".$message."')"; //inserting message into database
    $conn->query($sql2); //query for database
    $to  = $_SESSION["username"]; //this is the same format but sending the message to the company itself
    $message = $_SESSION["username"] . " updated your point to dollar ratio. Your new point to dollar ratio is " . $_SESSION["pointRatio"] . ".";
    $sql2 = "INSERT INTO project.messages(messages.date, messages.to, messages.from, messages.message) VALUES(now(), '".$to."', '".$from."', '".$message."')";
    $conn->query($sql2);
}

【问题讨论】:

  • 您的代码存在巨大的安全风险!!您很容易受到 sql-injection 的攻击。请阅读此内容并采取必要的步骤来防止它!!!!
  • 感谢您的指出,但我并没有太在意,因为它不用于任何商业用途。只是专注于学习更多关于mysqli和php的知识,虽然我绝对可以回去修复它。
  • 好吧,当您只是在学习和培训时,它就像用于任何(非)商业用途一样重要。您的目标不应该只是针对这个问题来解决它,而是要学习如何以正确的方式去做。这些知识将在您使用 sql 的所有过程中有所帮助。
  • messages 表的定义是什么——是否有任何独特的约束?
  • 您是 100% 正确的,我很欣赏您的建议。这绝对是我会回来的,我只是被这个特殊的问题困住了。

标签: php database session mysqli


【解决方案1】:

如果您添加 var_dump 并检查数据库中的记录 - 是否正确?你真的得到了所有的行吗?

$sql = 'SELECT drivers.username FROM project.drivers WHERE drivers.sponsor="'.$_SESSION["company"].'"'; //query to get all driver usernames within one company
$result = $conn->query($sql);
//$row = mysqli_fetch_array($result);
while($row = mysqli_fetch_array($result)){ //iterating throughout all the drivers
    var_dump($row);
}

【讨论】:

  • 在 mysql 工作台中检查它给了我所有的行,使用 var dump 也给了我所有的行。这是困扰我的部分原因。
  • 好的 - 如果你有所有的结果尝试下一个东西 - 在里面同时显示你的 sql 插入的文本 - 都正确吗?
  • 还是正确的。调用行中的每个值,sql 插入的文本是正确的。就像我在代码的其他部分中所做的插入一样。可能是查询调用的问题吗?
  • 所以在 project.messages 中新记录的数量与 $row 的数量相同吗?如果数字匹配 - 您的代码的另一部分不是您的问题吗?
猜你喜欢
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多