无法在 php 中使用 MYSQL INSERT INTO

Posted

技术标签:

【中文标题】无法在 php 中使用 MYSQL INSERT INTO【英文标题】:unable to use MYSQL INSERT INTO in php 【发布时间】:2014-06-20 10:00:18 【问题描述】:

其实我是新手,在插入 mysql 属性时遇到问题。

我创建了两个表格,即问题和答案。用户可以通过 html 表单放置数据(对于两个表)。由于一些未知的错误,数据没有插入到答案表中,问题表没有这样的问题。 奇怪的是,两个表的插入 php 代码几乎相同,除了变量的名称。

singleques_info.php 代码:

<?PHP

 session_start();
 $t=$_GET['p'];
 $ans= "";
 $error_message = "";
 $num_rows = 0;

 function quote_smart($value, $handle)
 
     if (get_magic_quotes_gpc()) 
        
         $value = stripslashes($value);
        
     if (!is_numeric($value)) 
        
         $value = "'" . mysql_real_escape_string($value, $handle) . "'";
        
     return $value;
     

 if ($_SERVER['REQUEST_METHOD'] == 'POST')
  
         $ans = $_POST['ans'];
         $ans = htmlspecialchars($ans);
         $uLength = strlen($ans);
         if ($uLength <=100) 
          
         $error_message = "";
          
           else 
          
           $error_message = $error_message . "Username must be between 10 and 20 characters" . "<BR>";
          


    if ($error_message == "") 
      
        $username = "root";
        $password = "";
        $database = "techinsight";
        $server = "127.0.0.1";
        $db_handle = mysql_connect($server, $username, $password);
        $db_found = mysql_select_db($database, $db_handle);

        if ($db_found) 
         
         echo "connected";
         $ans = quote_smart($ans, $db_handle);
         $SQL = "SELECT * FROM answers WHERE answer= $ans";
         $result = mysql_query($SQL);
         $num_rows = mysql_num_rows($result);
          if ($num_rows > 0)
           
            echo "Question already taken";
           
            else
                                     
            $SQL = "INSERT INTO answers (Aid, answer, date) VALUES ($t, $ans, CURDATE())";
            $result = mysql_query($SQL);
            mysql_close($db_handle);

            session_start();
            $_SESSION['login'] = "1";

            header ("Location:ques_wala_main.php");
            echo "You are done.";
           

        
         else 
        
          $errorMessage = "Database Not Found";
        

      
      //<div class="content_mess">
  /*    else
        
           session_start();
           $_SESSION['login'] = "";
           header ("Location: signup.php");
           echo "Please SignIn Before Asking....";
        
  // </div> */

 

 ?>

html 表单:

 <form id="ans" method="POST" name="ans" action="#">
   <div class="field extra">
    <label>your answer:</label> <br/> <br/> <br/>
    <textarea name="ans" cols="70" rows="6"></textarea>
   </div>
   <br/> <br/>
   <input type="submit" name="submit" value="submit" />
 </form>

【问题讨论】:

我还注意到您在 之后 if ($error_message == "") 并在此之前访问了mysql_real_escape_string($value, $handle) 。你连接到上面的数据库了吗? 另外,使用$t=$_GET['p'];,它是来自 POST 方法的 GET 方法。 $t=$_GET['p']; 是从哪里填充的? 其实这里是用GET方法从另一个页面通过url获取变量。 这既不好又“好”,因为我们现在知道问题所在,因为您所在的服务器上似乎不再提供 mysql_* 函数。所以现在您必须将所有mysql_ 实例更改为mysqli_,并且您可能需要对连接到数据库的方式进行一些修改。在mysqli_* 中,首先是数据库连接。 可能是因为就像我说的,你所在的服务器已经升级到了新版本的PHP,这些旧功能现在都不能使用了。 【参考方案1】:

这个问题已经在 cmets 中得到解答,但我会展开。

您似乎对两个方面感到困惑。首先是您在此处使用的 SQL 语句的正确准备。每个语句都包含两个重要部分。您指定:

    您要使用的表格的列:

    插入答案(帮助、答案、日期)

    以及您想与这些列一起使用的值:

    值 ($t, $ans, CURDATE())

MySQL syntax 允许您在其中没有空格(或其他字符)的情况下不封装列名,所以这部分没问题。然而,取决于列类型的值可能必须用单引号或双引号封装,例如您必须封装 VARCHARDATEDATETIMEBLOB 的值,但对于像 INTDECIMAL 这样的数字类型,或者当您告诉 MySQL 服务器在插入新记录之前计算一些东西(如CURDATE()10 + 5 等)。因此,假设您的列是:

Aid    - INT
answer - VARCHAR
date   - DATE

正确的 SQL 语句应该是(注意 $ans 周围的单引号和 CURDATE() 周围缺少引号):

INSERT INTO answers (Aid, answer, date) VALUES ($t, '$ans', CURDATE())

另一个让你感到困惑的方面是PHP deals with strings。您正在做的是告诉 PHP 准备一行文本(字符串)并将其传递给 MySQL 服务器,以便服务器运行它并将结果传递回 PHP(例如 mysql_insert_id() 就是这样的结果) .问题是 PHP 从开始到结束这个过程都不​​知道什么是 SQL 语句以及如何准备它。它只知道“这是一个字符串,我需要放入一些变量”。所以假设答案号32a submitted answer,这两个部分的代码:

$SQL = "SELECT * FROM answers WHERE answer= $ans";
[...]
$SQL = "INSERT INTO answers (Aid, answer, date) VALUES ($t, $ans, CURDATE())";

将产生以下正确的字符串但不正确的 SQL 语句:

SELECT * FROM answers WHERE answer= a submitted answer
INSERT INTO answers (Aid, answer, date) VALUES (32, a submitted answer, CURDATE())

希望解决方案现在很明显。

上面说过,我的回应只是为了提前付款(我们所有人都必须从某个地方开始)。这种编码风格已经过时,它的价值值得商榷(甚至作为一种学习手段)。它永远不应该看到生产环境。

编辑:

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead

以上应该是通知级别,可能不是问题。如果要检查函数是否可用,请运行以下脚本:

<?php
    $a = array(
        'mysql_connect', 
        'mysql_real_escape_string',
        'mysql_query',
        'mysql_fetch_assoc',
    );

    foreach ($a as $f)
        var_dump(function_exists($f));

【讨论】:

请在你的答案中填写$ans必须引用$SQL = "SELECT * FROM answers WHERE answer= $ans";【参考方案2】:

问题已通过 OP 在脚本顶部添加以下内容得到解决:

error_reporting(E_ALL);
ini_set('display_errors', 1);

不得不发现服务器不再支持mysql_*函数,不得不求助于切换到mysqli_*函数。

这已经通过多个 cmets 与 OP 进行了交谈。


现在使用mysqli_* 函数时,(带有额外选项):

在文件顶部添加错误报告,这将有助于生产测试。

error_reporting(E_ALL);
ini_set('display_errors', 1);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

MySQL(错误报告链接)

http://www.php.net/manual/en/mysqli.error.php http://www.php.net/mysqli_error

其他 API:

Use mysqli with prepared statements,或PDO

PDO 错误处理:

http://www.php.net/manual/en/pdo.error-handling.php http://www.php.net/manual/en/pdo.errorinfo.php

【讨论】:

以上是关于无法在 php 中使用 MYSQL INSERT INTO的主要内容,如果未能解决你的问题,请参考以下文章

mysql : 使用任何命令代替 mysql_insert_id();在 PHP 中?

MySQL 性能不佳 INSERT 或 PHP PDO

只有第一个 Mysqli Insert 查询与 PHP 工作,而其他人失败

php - 如何生成 MySQL INSERT 语句以使用数组中的多行填充表

无法使用 PHP 和 JQuery Ajax 将新记录插入 mysql db

php mysql_insert_id()