一旦我们在php页面中创建了触发器,那么我们需要在Mysql中创建相同的触发器吗


Once we create trigger in php page then do we need to create same in Mysql?

我将Mysql用于php代码的数据库目的。

我已经在php代码中创建了触发器,如下所示,现在我需要在mysql中创建它吗??

以下内容将数据插入表中,并显示表的内容。但我在触发器中执行的操作并没有任何改变。触发器有问题吗?

一旦它开始正常工作,但在我更改表名后,它就停止了工作,尽管我的php页面和mysql保持了表名不变。

<html>
<body>
<?php
$id=$_POST['id'];
$fname=$_POST['fname'];
$lname=$_POST['lname'];
$city=$_POST['city'];
$con=mysqli_connect('127.0.0.1:3306' ,'root','root','my_db');
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }
$sql1="select * from student";
$result = mysqli_query($con,$sql1);
echo "<table border='1'>
<tr>
<th>Id</th>
<th>Firstname</th>
<th>Lastname</th>
<th>City</th>
</tr>";
while($row = mysqli_fetch_array($result,MYSQLI_ASSOC))
{
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['fname'] . "</td>";
echo "<td>" . $row['lname'] . "</td>";
echo "<td>" . $row['city'] . "</td>";
echo "</tr>";
}
echo "</table>"; 
**$sql3 = "CREATE TRIGGER MysqlTrigger AFTER INSERT ON student FOR EACH ROW BEGIN INSERT INTO details VALUES ($id,$fname,$lname,$city);";**
mysqli_query($con,$sql3);

$sql5="INSERT INTO student (id,fname, lname, city)
VALUES
('$_POST[id]','$_POST[fname]','$_POST[lname]','$_POST[city]')";
mysqli_query($con,$sql5);
echo "1 record added";
print "<h2>After performing Trigger updated table details</h2>";
echo "<table border='1'>
<tr>
<th>Id</th>
<th>Firstname</th>
<th>Lastname</th>
<th>City</th>
</tr>";
$sql4="select * from details";
$res = mysqli_query($con,$sql4);
while($row = mysqli_fetch_array($res,MYSQLI_ASSOC))
{
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['fname'] . "</td>";
echo "<td>" . $row['lname'] . "</td>";
echo "<td>" . $row['city'] . "</td>";
echo "</tr>";
}
echo "</table>"; 
mysqli_close($con);
?>
</body>
</html>

简短的回答-不,你不必这样做,因为在代码中创建它也会在MySQL中创建它。但你有更大的问题。

更长的答案-

触发器是数据库的一部分,通常不会从代码中创建触发器。创建触发器的方式与创建表的方式相同——在MySQL中创建一次触发器,它们会一直保留到您删除它们。

从技术上讲,您所拥有的代码可以工作,但CREATE TRIGGER语句只有在第一次被调用时才会成功。在该脚本的后续执行中,CREATE TRIGGER将出错,因为触发器已经存在。但由于您没有检查错误,您的脚本可能会愉快地继续运行。

此外,按照创建触发器的方式,它将始终向创建触发器时插入的details表中插入相同的记录。

最后,您的代码存在一些严重的安全问题:

  1. 您直接在SQL中使用POST变量,这将打开SQL注入
  2. 无论您的站点作为什么用户运行,都可能不应该有权限执行像CREATE TRIGGER这样的DDL语句