-1

我正在尝试检查表中是否有某个列,如果没有,则将该列添加到其中。只要输入值没有 @ 符号,我的代码似乎就可以正常工作。我试过用和不带单引号将 '$email' 括起来作为输入字符串。任何帮助将非常感激。

$email = strtolower(mysql_real_escape_string($_SESSION['email']));
$result = mysql_query("SHOW COLUMNS FROM `selections` LIKE '$email'",$conn);
$exists = (mysql_num_rows($result))?TRUE:FALSE;

if ($exists == FALSE) {
$query2 = "ALTER TABLE  selections ADD  $email VARCHAR( 120 ) NOT NULL";
$add= mysql_query($query2,$conn);
var_dump($query2);
echo("this error". mysql_error());
}    

$query2 是直接从 phpmyadmin 获取的,即使使用 @ 符号输入似乎也可以在那里工作

谢谢你的帮助!

4

2 回答 2

3

在此之前,考虑以另一种方式执行此操作。您将为每封电子邮件在表格中添加一个字段 - 您可能不知道的是,这会通过增加行的大小来增加表格的大小,并且还会将您限制为固定数量的字段(此链接清楚每行最多突出显示总共 65535 个字节。每个 VARCHAR 字符,取决于字符集,在 3 到 8 个字节之间)

您的请求失败的真正原因是因为@您的 SQL 查询中有一个特殊字符,而 phpmyadmin 恰好足够聪明以逃避它。@表示 MySQL 使用的 SQL 方言中的变量。您可以为 MySQL 使用反引号转义它,或者您可以退出使用它以支持如下表结构:

 selection:
  * id
  * your metadata here

 emails:
  * id
  * email_address

 selection_emails:
  * id
  * selection_id
  * email_id

第三个表称为关联表。它允许您继续规范化您的数据。

于 2013-06-15T23:38:36.920 回答
0

您可以用大括号将电子邮件括{$email}起来以将其明确定义为字符串中的变量,但在此之前您可能还需要转义此变量中的奇数字符。

更改表格时,您还应该用反引号将其包围,以允许使用奇数字符。

最好的方法是使用参数化查询,并删除已弃用的 mysql 库。并且不允许在字段名称中使用奇数字符。

我还会质疑您为什么将电子邮件添加为新列。

于 2013-06-15T23:38:03.810 回答