【问题标题】:if else inside of $_post issetif else 在 $_post isset 内
【发布时间】:2016-06-20 18:45:13
【问题描述】:

我有一份由体育教练填写的表格。教练可以进行多项他们教练的运动,而球员可以参加多项运动。因此,如果教练想要将一名球员添加到球队名单中,我需要检查该球员是否存在,如果存在,那么只需将球员 ID 添加到名单表中,而不是将球员再次添加到球员表中。下面是我想要完成的最好的表示。

if (isset($_POST['submit'])) {

$email = mysqli_real_escape_string($con2, $_POST['email']);

$sql1 = "SELECT id, email FROM users WHERE email='$email'";
$result = $con2->query($sql1);


if ($result->num_rows > 0) {

//here is where I want to just add specific information


} //I have tried if $result == 0 and else if $result == 0


//here is where I would add the user if the email doesn't exist.

}  <-- //I feel like the issue is the if (isset($_POST['submit'])) which end just before this line. 

因此,根据我放置 (isset($_POST['submit'])) 末尾的位置,我得到了不同的结果。我试图弄清楚如何保留 $_POST 被设置但不执行其中的所有内容。我对此非常了解,所以如果我的问题看起来很基本,请原谅我。感谢您花时间审查我的问题。

其他信息 所以我在获取行数时没有问题。问题是即使电子邮件存在,用户在用户表中也会重复,但在其余表中用户不会重复。基本上 (isset($_POST['submit'])) 中的所有内容都会运行,这是有道理的,因为当提交表单时,这会评估为 true。

本质上,我想在 (isset($_POST['submit'])) 内部运行 if else ,如果有意义的话,两者都不会被执行。

【问题讨论】:

  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 不要使用手动转义和字符串插值或连接来完成此操作,因为如果您忘记正确转义某些内容,您将创建严重的SQL injection bugs
  • 您是否要更新数据库中存在的用户?只有当他有电子邮件?
  • 请停止测试num_rows 它并不总是可靠的——数据总是可靠的。如果您不想查看结果,那么只需SELECT count(id) FROM users WHERE email='$email'。并获取结果 - 总是有一行,计数为零或更多。始终测试“真实数据”,其他一切都可能“不可靠”。如果效率是一个问题,你总是可以添加一个`LIMIT 1`
  • @AdiAzarya 关系是教练和球员。教练可以进行多项他们教练的运动,而球员可以参加多项运动。因此,如果教练想要将一名球员添加到球队名单中,我需要检查该球员是否存在,如果存在,则只需将球员 ID 添加到名单表中,而不是将球员再次添加到球员表中。
  • @RyanVincent 谢谢你。就像我说的,我对 PHP 非常了解,你所说的非常有道理。我不知道 count() 是我以前从未见过的选项。

标签: php mysql if-statement


【解决方案1】:

您应该按照@tadman 的建议使用参数化查询。

但是,我不会批评您的代码,但建议您尝试一下该功能:

mysqli_num_rows($result)

这应该返回结果集中的行数。请让我们知道这是否是您想要的。

【讨论】:

  • 我正在慢慢学习 PHP 的“做”和“不做”方法,所以我肯定会致力于编写正确或最佳实践的方法。只是想诚实地把握现在的事情。我会尝试 mysqli_num_rows 看看这是否能解决问题。
  • 好的@RyanVincent,你不必一遍又一遍地这么说。但是,我必须同意您关于使用 count($id) 的解决方案适用于 @MBRD 案例。一般来说,我希望避免创建简单的 SQL 查询,因为它们可能会成为管理负担。
  • fyi, imo, num_rows(我的意思是数据库中的任何“行数指标”)对于查询和更新都不可靠(即,它永远不是“行数”的准确指标或'更新的行数')。 imo,始终测试 real data 而不是指标。您可以“信任”它的插入和删除。没有其他的。示例 - 更新一行而不做任何更改,row count 为零 - 即使一切正常。
  • @RyanVincent 我明白你在做什么。真的,您必须删除您的 cmets,以便我的评论在您的评论之上没有任何意义。不要比哈尔更浅。
【解决方案2】:

我将向您展示非常简单的mysqli示例,希望对您有所帮助:)

<?php
$servername = "localhost";
$username = "username";//YOUR USER NAME!
$password = "password";//YOUR PASSWORD!
$dbname = "myDB"; //YOUR DB NAME!

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
if (isset($_POST["save"])){
  $var1 = $_POST['memberID'];   //form parameters
  $var2 = $_POST['firstName']; //form parameters
  $var3 = $_POST['surname'];  //form parameters
  $var4 = $_POST['email'];   //form parameters

  //query example 
  $query = "SELECT ".$var4." FROM City ORDER by ID DESC LIMIT 50";

  if ($result = $conn->query($query)) {

    /* fetch object array */
    while ($row = $result->fetch_row()) {
        printf ("%s (%s)\n", $row[0], $row[1]);
    }

    /* free result set */
    $result->close();
}
$conn->close();

?>

您可以看到this 页面。可能会帮助您了解它是如何工作的!

【讨论】:

    【解决方案3】:

    你试过了吗:

    ....
    $query = "SELECT* FROM City WHERE email=".$var4."";
    
      if ($result = $conn->query($query))
      {
      if($result != " "){}//the player exist->DO SOMETHING
      else{}//DO SOMETHING//the player not exist->DO SOMETHING
      }
    ...
    

    也许我不太了解你:|

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2015-03-05
      • 1970-01-01
      相关资源
      最近更新 更多