3

我将 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>
4

1 回答 1

4

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

更长的答案 -

触发器是数据库的一部分,通常您不会从代码中创建触发器。您可以像创建表一样创建触发器——在 MySQL 中创建一次,它们会一直存在,直到您删除它们。

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

此外,根据您的触发器的制作方式,它将始终将相同的记录插入到details创建触发器时插入的表中。

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

  1. 您直接POST在 SQL 中使用变量,这使您可以使用 SQL 注入
  2. 无论您的网站正在运行什么用户,都可能不应该有权执行 DDL 语句,例如CREATE TRIGGER
于 2013-07-03T17:19:01.420 回答