使用两个不同的函数访问sql数据库

时间:2017-02-01 13:50:37

标签: php mysqli

我正在为一个项目制作一个电影评级网站,如何进行评级系统让我一片空白。如果你知道,请告诉我一个正确的方法。

这将从网址获取电影号码,并在页面中显示相关信息

<body>
<?php
global $conn;
$conn = mysqli_connect('localhost','root','','filmsdb');

function show()
{
global $film;
global $conn;
$film = $_GET['fm'];


$sql = "SELECT * FROM movies WHERE m_No='$film'";
$ok = mysqli_query($conn,$sql);

$data = mysqli_fetch_array($ok);
$c_r= $data[8];
$c_rc= $data[9];

?>
//displays the movie information and uses radio buttons to get user rating

然后,这可以让用户评价电影

<?php

}


function act1()
{
if(isset($_POST['rsub']))
{
    global $film;
    global $conn;

    $rate = $_POST['rate'];

    $sqlr= "UPDATE movies SET rating=rating+$rate, rate_count=rate_count+1 WHERE m_No='$film'";
    $output = mysqli_query($conn,$sqlr);
}

if($output==1)
{
    echo 'Data Stored';
}
else
{
    echo 'Data Not Stored ';
    echo mysqli_error($conn);
}
}
$conn = null;
?>
</body>
</html>

当只使用第一个函数时,它可以工作,但是当我尝试使用评级系统时,这个错误出现在浏览器中,mysqli_query()期望参数1是mysqli,null给定...任何想法解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的问题是,当页面回发用户评级数据时,您依赖于数据库连接的两个变量$conn$film不存在。

您的应用程序的生命周期如下:

1)用户提出初始请求。 PHP启动并运行第一个代码块,它向页面回显一些值,页面返回给用户。返回页面后,请求完成,PHP停止执行。声明的所有变量和内存中的变量都会丢失,因为进程已停止运行。

2)从PHP脚本返回的页面到达用户的浏览器。用户输入他们的评级并将数据发回服务器。这构成了一个全新的要求。

3)新请求到达服务器。 PHP再次启动。 Web本质上是无状态的,因此默认情况下它不会记住先前的请求。当然不是任何内存变量中的名称或值 - 包含它们的过程很久以前就已经死了,并且与新变量没有关联。

因此,如果您有任何值需要在PHP中再次使用第二个请求,您可以再次创建它们,或者在请求数据中接收它们,或者第一个PHP脚本必须将它们存储在某个持久的地方您可以从中查找它们,例如会话变量或cookie或数据库。

从您发布的代码中不清楚,但可能在第二个请求中以某种方式调用函数act1()并尝试将数据插入数据库。它失败了,因为在这个新请求中,$ film或$ conn都没有任何值。

我建议你这样解决:

1)再次创建连接对象,这很简单,无论如何你都需要重新连接到MySQL。

2)您评级的电影应该从表格数据中的浏览器传回。

这是第一个获取初始电影数据并将评级表格呈现给页面的脚本。

//re-usable function to connect to DB. Maybe move this out to a separate file so all pages can use it.
function getDBConn() {
  return mysqli_connect('localhost','root','','filmsdb');
}

function show()
{
  $conn = getDBConn();
  $film = $_GET['fm'];
  $sql = "SELECT * FROM movies WHERE m_No='$film'";
  $ok = mysqli_query($conn,$sql);
  $data = mysqli_fetch_array($ok);
  $c_r= $data[8];
  $c_rc= $data[9];
  $conn = null;
}

您的最新更新并未显示该表单,但我会假设它是这样的,还有一个额外的电影隐藏字段。它周围也应该有合适的表格标签。

<input type="radio" value="1" name="rate">
<input type="radio" value="2" name="rate">
<input type="radio" value="3" name="rate">
<input type="radio" value="4" name="rate"><input type="radio" value="5" name="rate">
<input type="hidden" name="film" value="<?php echo $film;?>"/>
<input type="submit" value="Rate" name="rsub">

现在是第二个脚本,在提交评级数据时运行。你还没有说明如何调用act1(),但我会假设你已经覆盖了它。

function act1()
{
  if(isset($_POST['rsub']))
  {
    $film = $_POST['film']; //get the film ID from the submitted form
    $conn = getDBConn(); //assuming this script is in the same .php file as the first block, otherwise you'll need to move getDBConn into a separate php file and then include the file in each script.

    $rate = $_POST['rate'];
    $sqlr = "UPDATE movies SET rating=rating+$rate, rate_count=rate_count+1 WHERE m_No='$film'";
    $output = mysqli_query($conn, $sqlr);
  }

  if ($output==1)
  {
    echo 'Data Stored';
  }
  else
  {
    echo 'Data Not Stored';
    echo mysqli_error($conn);
  }

  $conn = null;
}

P.S。我知道它只是一个示例项目,但是如果你创建一个真实的网站,请注意上面的注释重新注入SQL,并且不要让你的应用程序和网站登录到你的数据库中作为&#34;根&#34;要么 - 只给他们实际需要的特权。