无法在 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 允许您在其中没有空格(或其他字符)的情况下不封装列名,所以这部分没问题。然而,取决于列类型的值可能必须用单引号或双引号封装,例如您必须封装 VARCHAR
、DATE
、DATETIME
和 BLOB
的值,但对于像 INT
和 DECIMAL
这样的数字类型,或者当您告诉 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 语句以及如何准备它。它只知道“这是一个字符串,我需要放入一些变量”。所以假设答案号32
是a 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 中?
只有第一个 Mysqli Insert 查询与 PHP 工作,而其他人失败
php - 如何生成 MySQL INSERT 语句以使用数组中的多行填充表