【问题标题】:Running multiple queries in php在php中运行多个查询
【发布时间】:2023-03-15 05:55:01
【问题描述】:

我是 PHP 和 HTML 的新手。按下提交按钮后,我尝试使用用户 MySQL 表中已经存在的数据填充字段(这有效)。我还想将使用 SELECT 获得的相同数据插入另一个名为 scan 的 SQL 表中。

<?php
// php code to search data in mysql database and set it in input text
if(isset($_POST['search']))
{


    // id to search
    $user_id = $_POST['user_id'];

    // connect to mysql
    $connect = mysqli_connect("127.0.0.1", "root", "root","demodb");

    // mysql search query


    $query = "SELECT * FROM Users WHERE user_id = $user_id LIMIT 1";
    $query = "INSERT INTO scan (user_id, osha, firstname, lastname, company, trade, email, picture) SELECT user_id, osha, firstname, lastname, company, trade, email, picture FROM Users WHERE user_id = $user_id LIMIT 1";



    $result = mysqli_query($connect, $query);



    // if id exist 
    // show data in inputsi
    if(mysqli_num_rows($result) > 0)
    {
      while ($row = mysqli_fetch_array($result))
      {
        $osha = $row['osha'];
        $firstname = $row['firstname'];
        $lastname = $row['lastname'];
        $company = $row['company'];
        $trade = $row['trade'];
      }  
    }

    // if the id not exist
    // show a message and clear inputs
    else {
        echo "Undifined ID";

            $osha = "";
            $firstname = "";
            $lastname = "";
            $company = "";
            $trade = "";
    }


    mysqli_free_result($result);

    mysqli_close($connect);
}    


// in the first time inputs are empty
else{
            $osha = "";
            $firstname = "";
            $lastname = "";
            $company = "";
            $trade = "";
}


?>

<!DOCTYPE html>

<html>

    <head>

        <title> PHP FIND DATA </title>

        <meta charset="UTF-8">

        <meta name="viewport" content="width=device-width, initial-scale=1.0">

    </head>

    <body>

    <form action="barcode.php" method="post">

    Id:<input type="text" name="user_id"><br><br>

    Osha #:<input type="text" name="osha" value="<?php echo $osha;?>"><br><br>

        First Name:<input type="text" name="firstname" value="<?php echo $firstname;?>"><br>
<br>

        Last Name:<input type="text" name="lastname" value="<?php echo $lastname;?>"><br><br>

    Company:<input type="text" name="company" value="<?php echo $company;?>"><br><br>

    Trade:<input type="text" name="trade" value="<?php echo $trade;?>"><br><br>

    <input type="submit" name="search" value="Find">

           </form>

    </body>

</html>

但似乎我当时只能在 PHP 中运行一个查询。我尝试集成 mysqli_multi_query,但我不断收到以下错误“mysqli_num_rows() 期望参数 1 为 mysqli_result”。

如何运行两个查询并同时使用数据填充字段。

添加表定义

用户表

| Users | CREATE TABLE `Users` (
  `user_id` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `osha` int(50) DEFAULT NULL,
  `firstname` varchar(30) NOT NULL,
  `lastname` varchar(30) NOT NULL,
  `company` varchar(50) DEFAULT NULL,
  `trade` varchar(50) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `picture` varchar(50) DEFAULT NULL,
  `reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=98819 DEFAULT CHARSET=latin1 |

扫描表格

| scan  | CREATE TABLE `scan` (
  `user_id` int(6) unsigned NOT NULL DEFAULT '0',
  `osha` int(50) DEFAULT NULL,
  `firstname` varchar(30) NOT NULL,
  `lastname` varchar(30) NOT NULL,
  `company` varchar(50) DEFAULT NULL,
  `trade` varchar(50) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `picture` varchar(50) DEFAULT NULL,
  `reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

【问题讨论】:

  • 您阅读过mysqli_multi_query() 的文档吗? (1) 您的查询需要以 ; 结尾,并且 (2) 您需要连接您的查询 -> $query .=,因为您目前正在用第二个查询覆盖第一个查询。
  • 有些人觉得this很有启发性
  • 我试图用INSERT INTO ON DUPLICATE KEY UPDATE AND UNION 想象一个光滑的单个查询,然后检查受影响的行数... 我相信结果可能是 0、1 或2。 ...类似于this

标签: php html


【解决方案1】:

首先不要在查询中直接使用变量。出于安全目的,现在强烈建议使用准备好的语句。

因此,像这样更改您的查询,并且当您同时执行两个查询时,有必要将变量命名为不同的名称,否则后一个将覆盖前一个:

$query1 = "SELECT * FROM Users WHERE user_id = ? LIMIT 1";
$query2 = "INSERT INTO scan (user_id, osha, firstname, lastname, company, trade, email, picture) SELECT user_id, osha, firstname, lastname, company, trade, email, picture FROM Users WHERE user_id = ? LIMIT 1";

然后创建如下准备好的语句:

$stmt = mysqli_stmt_init($connect);
$stmt2 = mysqli_stmt_init($connect);

mysqli_stmt_prepare($stmt, $query1);
mysqli_stmt_prepare($stmt2, $query2);

mysqli_stmt_bind_param($stmt, "s", $user_id);
mysqli_stmt_bind_param($stmt2, "s", $user_id);

然后执行查询:

mysqli_stmt_execute($stmt);
mysqli_stmt_execute($stmt2);

最后,你通过这个得到$query1的结果:

$result = mysqli_stmt_get_result($stmt);

【讨论】:

  • 您也可以使用mysqli_real_escape_string 作为参数化查询的完全可接受的替代方案,它实际上更快,生成更简洁的代码,并且只要您正确设置字符集,它同样安全。参数化查询在迭代和插入数据集时更快,但对于单个查询,它会增加额外的开销。
【解决方案2】:

您正在用新值覆盖变量$query,而不是先执行查询。也就是说,尽管您的代码有很多问题:

  • 你不是在逃避$_POST['user_id'],请阅读SQL注入攻击。
  • 您没有转义您的 HTML,请阅读 XSS 攻击。
  • 您的逻辑流程重复代码
  • 您通过两次获取数据、仅获取一次和插入一次来增加数据库的额外负载。

请参阅下面的重写代码。

<?php
// initalize the variables 
$osha      = "";
$firstname = "";
$lastname  = "";
$company   = "";
$trade     = "";

// php code to search data in mysql database and set it in input text
if(isset($_POST['search']))
{
    // connect to mysql
    $dbc = mysqli_connect("127.0.0.1", "root", "root","demodb");

    // id to search
    $user_id = mysqli_real_escape_string($dbc, $_POST['user_id']);

    $query = "SELECT * FROM Users WHERE user_id = '$user_id' LIMIT 1";
    $rs    = mysqli_query($dbc, $query);
    if (mysqli_num_rows($rs) == 1)
    {
      $row       = mysqli_fetch_array($rs);
      $osha      = $row['osha'];
      $firstname = $row['firstname'];
      $lastname  = $row['lastname'];
      $company   = $row['company'];
      $trade     = $row['trade'];

      $query     = "INSERT INTO scan (user_id, osha, firstname, lastname, company, trade, email, picture) VALUES (" .
        "'" . $user_id . "', '" .
        "'" . mysqli_real_escape_string($dbc, $osha     ) . "', '" .
        "'" . mysqli_real_escape_string($dbc, $firstname) . "', '" .
        "'" . mysqli_real_escape_string($dbc, $lastname ) . "', '" .
        "'" . mysqli_real_escape_string($dbc, $company  ) . "', '" .
        "'" . mysqli_real_escape_string($dbc, $trade    ) . "')";
      mysqli_query($dbc, $query);
    }
    else
    {
      echo "Undefined ID";
    }
}    
?>

<!DOCTYPE html>

<html>

    <head>

        <title> PHP FIND DATA </title>

        <meta charset="UTF-8">

        <meta name="viewport" content="width=device-width, initial-scale=1.0">

    </head>

    <body>

    <form action="barcode.php" method="post">

    Id:<input type="text" name="user_id"><br><br>

    Osha #:<input type="text" name="osha" value="<?= htmlspecialchars($osha) ?>"><br><br>

        First Name:<input type="text" name="firstname" value="<?= htmlspecialchars($firstname) ?>"><br>
<br>

        Last Name:<input type="text" name="lastname" value="<?= htmlspecialchars($lastname) ?>"><br><br>

    Company:<input type="text" name="company" value="<?= htmlspecialchars($company) ?>"><br><br>

    Trade:<input type="text" name="trade" value="<?= htmlspecialchars($trade) ?>"><br><br>

    <input type="submit" name="search" value="Find">

           </form>

    </body>

</html>

【讨论】:

  • 为什么对一个完全可以接受、简洁和正确的答案投了反对票?
  • 我想知道...可能有些 PDO 粉丝对这里没有使用 PDO 感到不高兴
  • 感谢您的帮助!但是,我在上面尝试了您的代码,似乎第二个查询没有在表扫描中插入任何内容。有什么想法吗?
  • 大家好,知道如何使用上面的代码进行第二个工作吗?
  • @Unxcellent 请显示您的表定义(show create table Usersshow create table scan),以便我们重现您的设置和测试。
猜你喜欢
  • 1970-01-01
  • 2012-11-03
  • 2021-07-19
  • 1970-01-01
  • 2018-11-11
  • 2020-05-25
  • 2022-07-18
相关资源
最近更新 更多