PHP,查询失败

PHP,查询失败,php,Php,我有这段代码,变量“p1”是一个int。调试器显示它正确地接受值。但我得到“查询失败”。数据库值设置为int。是否有帮助 <?php session_start(); include 'connect_db.php'; $con = $_SESSION['connection']; $query = "SELECT * FROM class WHERE id_class ='".$_GET['p1']."'"; $result=@

我有这段代码,变量“p1”是一个int。调试器显示它正确地接受值。但我得到“查询失败”。数据库值设置为int。是否有帮助

<?php
    session_start();
    include 'connect_db.php'; 
    $con = $_SESSION['connection'];

        $query = "SELECT * FROM class WHERE id_class ='".$_GET['p1']."'";
        $result=@mysql_query($con,$query) or die('Error, query1 failed');
        $num_result=mysqli_num_rows($result);


        if($num_result>0){

                $insert_query= " INSERT INTO user_program SET 
                                            id_class='".$_POST['id_class']."'
                                            WHERE id_user='".$_SESSION['id_user']."'";

        $insert=mysqli_query($con,$insert_query) or die('Error,query2 failed');


            if ($insert) {
                echo '<html><meta charset="UTF-8"><script language="javascript">alert("ok!"); document.location="add_classes_form.php";</script></html>';
            }
            else {
                echo '<html><meta charset="UTF-8"><script language="javascript">alert("not ok.")</script></html>';
                echo '<script language="javascript"> document.location="add_classes_form.php";</script>';
                exit();
            }   
        }

首先,您不能将
mysql
mysqli
混用,正如您在示例中看到的那样

Mysql
已被弃用
,但我将举个例子,看看它在
Mysql
mysqli
中是如何工作的,以及这两种方法之间的区别

避免在查询中使用@,因为你看不到是否出现真正的错误,这是一种不好的做法

首先,这在两方面都是不好的做法,因为即使使用
mysql\u real\u escape\u string()
mysqli\u real\u escape\u string()
来转义变量,也不安全。不要在准备好的语句中使用
PDO

使用
mysqli

// mysqli connection
$con = mysqli_connect('host', 'username', 'password', 'database_name');
代码


change
mysql\u query($con,$insert\u query)
改为
mysql\u query($insert\u query)
不要将
mysql
mysqli
syntaxi混用如果你在写新代码,请不要使用
mysql\u*
函数。它们是旧的、破损的,在PHP5.5中被弃用(它太旧了,甚至不再接收安全更新),在PHP7中被完全删除。使用或与准备好的语句和参数绑定一起使用。有关详细信息,请参阅。您完全可以并且应该使用而不是串联查询,如果您使用上述MySQLi或PDO,可以使用这些查询。删除呼叫前的
@
,您可能会收到有用的错误消息,而不是抑制任何潜在错误。抑制错误是不好的做法。相反,您应该处理错误,这在调试代码时也会对您有所帮助,就像在本例中一样。这是因为您将
mysql\u*
mysqli\u*
混合在一起,并且正如其他人指出的那样,使用它们是错误的。它们是两个完全不同的api。。不要使用
mysql\u*
您应该真正删除
mysql\u*
示例,因为它很旧,不推荐使用,而且不安全。您还应该建议使用而不是转义输入,因为在某些特定情况下,即使是
mysqli\u real\u escape\u string()
也可能不安全。谢谢您的时间。现在,我在id\u user和id\u classes中都出现了“Undefined index”错误,在
INSERT
查询中
WHERE
如何工作?如果你看OP的代码,它可能是一个
更新
,而不是一个
插入
。编辑成
更新
@NikosKiriakakis是你得到的“未定义索引”,你应该首先检查表单是否提交,然后使用其他代码,因为你从表单输入中得到
$\u POST['id\u user']
<?php

session_start();
include 'connect_db.php';
$con = $_SESSION['connection'];

$p1 = mysqli_real_escape_string($con, $_GET['p1']);

$query = "SELECT * FROM class WHERE id_class = '$p1'";
$result = mysqli_query($con, $query) or die('Error, query failed');
$num_result = mysqli_num_rows($result);

$id_class = mysqli_real_escape_string($con, $_POST['id_class']);
$id_user = mysqli_real_escape_string($con, $_SESSION['id_user']);

if ($num_result > 0)
{
    $insert_query = "UPDATE user_program SET id_class = '$id_class' WHERE id_user = '$id_user'";

    $insert = mysqli_query($con, $insert_query) or die('Error,query failed');


    if ($insert)
    {
        echo '<html><meta charset="UTF-8"><script language="javascript">alert("OK!"); document.location="add_classes_form.php";</script></html>';
    }
    else
    {
        echo '<html><meta charset="UTF-8"><script language="javascript">alert("Not OK.")</script></html>';
        echo '<script language="javascript"> document.location="add_classes_form.php";</script>';
        exit();
    }   
}
?>