语法错误的问题

时间:2011-08-17 16:07:06

标签: php sql

嗨,大家好我的sql的语法错误,正好说:

“您的SQL语法出错;请查看与您的MySQL服务器版本对应的手册,以获得正确的语法”

即使代码正常工作并按我的意愿行事,我仍然会收到语法错误信息! 这是代码:

  $person_id =mysql_query("SELECT person_id FROM person WHERE firstname='$array[0]'    AND lastname='$array[1]' AND city='$array[2]' ")
or die(mysql_error());
if (mysql_num_rows($person_id) )
{
     print 'user is already in table';
}
else
 {
mysql_query ("INSERT INTO person VALUES (NULL, '$array[0]' ,'$array[1]' , '$array[2]' ")
 or die(mysql_error());  
 $person_id = mysql_insert_id();
}

$address_id =mysql_query("SELECT address_id FROM address WHERE street='$array[3]' AND city='$array[4]' AND region='$array[5]'")
or die(mysql_error());
if (mysql_num_rows($address_id) )
{
    print ' already in table';
}
else
{
mysql_query ("INSERT INTO address VALUES (NULL, '$array[3]', '$array[4]', '$array[5]'")
or die(mysql_error());  

$address_id = mysql_insert_id();
}

mysql_query ("INSERT INTO person_address VALUES($person_id, $address_id)")
or die(mysql_error());  

感谢您的任何建议

3 个答案:

答案 0 :(得分:4)

这可能是因为你没有逃脱你的价值观......

尝试:

$query = "SELECT age FROM person WHERE name='".mysql_real_escape_string($array[0])."' AND lastname='".mysql_real_escape_string($array[1])."' AND city='".mysql_real_escape_string($array[2])."'";

read up on SQL injection

修改

我认为您的问题是您尝试将mysql结果资源直接传递给字符串,而不首先获取实际值。

试试这个:

// Create an array of escaped values to use with DB queries
$escapedArray = array();
foreach ($array as $k => $v) $escapedArray[$k] = mysql_real_escape_string($v);

// See if the person already exists in the database, INSERT if not
$query = "SELECT person_id FROM person WHERE firstname='$escapedArray[0]' AND lastname='$escapedArray[1]' AND city='$escapedArray[2]' LIMIT 1";
$person = mysql_query($query) or die(mysql_error());
if ( mysql_num_rows($person) ) {
    print 'user is already in table';
    $person = mysql_fetch_assoc($person);
    $person_id = $person['person_id'];
} else {
    $query = "INSERT INTO person VALUES (NULL, '$escapedArray[0]', '$escapedArray[1]', '$escapedArray[2]')";
    mysql_query($query) or die(mysql_error());  
    $person_id = mysql_insert_id();
}

// See if the address already exists in the database, INSERT if not
$query = "SELECT address_id FROM address WHERE street='$escapedArray[3]' AND city='$escapedArray[4]' AND region='$escapedArray[5]'";
$address = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($address) ) {
    print 'address already in table';
    $address = mysql_fetch_assoc($address);
    $address_id = $person['address_id'];
} else {
    $query = "INSERT INTO address VALUES (NULL, '$escapedArray[3]', '$escapedArray[4]', '$escapedArray[5]')";
    mysql_query ($query) or die(mysql_error());  
    $address_id = mysql_insert_id();
}

// INSERT a record linking person and address
mysql_query ("INSERT INTO person_address VALUES($person_id, $address_id)") or die(mysql_error());  

另一个编辑

首先,我修改了上面的代码 - 添加了几条注释,纠正了一些引用了错误变量的小错误,并重新分隔它以使其更具可读性。

...其次

您正在收到其他错误,因为您尝试在person_address表中插入一个新行,该表似乎没有合理配置的主键。解决当前问题的简单方法是对此表运行SELECT以查看您是否已经为该用户创建了记录,然后如果有,则可以执行UPDATE而不是INSERT来更改现有记录。

但是,如果我理解你在这里做的正确,你实际上并不需要person_address表,你只需要在person表中添加另一个整数列来保存address表中的相应行。这样做可以使您将来的许多查询更加简单和高效,因为一次从两个表中选择数据会更容易(您可以使用当前结构来完成它,但会更加混乱和低效)。 / p>

如果您在person的末尾添加另一个整数列,并调用该列address_id,则可以使用以下代码示例。您会注意到它与上述非常相似,但有两个主要区别:

  • 我们首先处理地址内容,因为我们将跟踪人员记录中的关系
  • 我们只在找到一个人时才进行更新,否则我们就像以前一样插入一个新人
// Create an array of escaped values to use with DB queries
$escapedArray = array();
foreach ($array as $k => $v) $escapedArray[$k] = mysql_real_escape_string($v);

// See if the address already exists in the database, INSERT if not
$query = "SELECT address_id FROM address WHERE street='$escapedArray[3]' AND city='$escapedArray[4]' AND region='$escapedArray[5]'";
$address = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($address) ) {
    print 'address already in table';
    $address = mysql_fetch_assoc($address);
    $address_id = $person['address_id'];
} else {
    $query = "INSERT INTO address VALUES (NULL, '$escapedArray[3]', '$escapedArray[4]', '$escapedArray[5]')";
    mysql_query ($query) or die(mysql_error());  
    $address_id = mysql_insert_id();
}

// See if the person already exists in the database, UPDATE if he does, INSERT if not
$query = "SELECT person_id FROM person WHERE firstname='$escapedArray[0]' AND lastname='$escapedArray[1]' AND city='$escapedArray[2]' LIMIT 1";
$person = mysql_query($query) or die(mysql_error());
if ( mysql_num_rows($person) ) {
    print 'user is already in table';
    $person = mysql_fetch_assoc($person);
    $person_id = $person['person_id'];
    $query = "UPDATE person SET address_id = '$address_id' WHERE person_id = '$person_id'";
    mysql_query($query) or die(mysql_error());
} else {
    $query = "INSERT INTO person VALUES (NULL, '$escapedArray[0]', '$escapedArray[1]', '$escapedArray[2]', '$address_id')";
    mysql_query($query) or die(mysql_error());
}

如果我们以这种方式构建数据库,它允许我们这样做:

SELECT person.*, address.* FROM person, address WHERE person.address_id = address.address_id AND [some other set of conditions]

将在相同的结果集中返回人员记录和地址记录,这些都可以很好地与数据库匹配。

另一个编辑

您需要向person_address表添加自动增量主键,并对其执行SELECT以确保您不添加重复记录。

您应该使用以下代码段替换最终的INSERT语句。此代码假定您在person_address表中有一个名为relation_id的主键。它还假定此表中的id字段名称的命名方式与其他两个表中的名称相同。

// See if a relation record already exists for this user
// If it does, UPDATE it if the address is different
// If it doesn't, INSERT an new relation record
$query = "SELECT relation_id, address_id FROM person_address WHERE person_id = '$person_id' LIMIT 1";
$relation = mysql_query($query);
if ( mysql_num_rows($relation) ) {
    $relation = mysql_fetch_assoc($relation);
    if ($relation['address_id'] == $address_id) {
        print 'The record is identical to an existing record and was not changed';
    } else {
        $relation_id = $relation['relation_id'];
        $query = "UPDATE person_address SET address_id = '$address_id' WHERE relation_id = '$relation_id'";
        mysql_query($query) or die(mysql_error());  
    }
} else {
    $query = "INSERT INTO person_address VALUES(NULL, '$person_id', '$address_id')";
    mysql_query($query) or die(mysql_error());  
}

进行更多编辑

尝试此操作来替换上面的代码:

// See if a relation record already exists for this user
// If it doesn't, INSERT an new relation record
$query = "SELECT person_id FROM person_address WHERE person_id = '$person_id' AND address_id = '$address_id' LIMIT 1";
$relation = mysql_query($query);
if ( !mysql_num_rows($relation) ) {
    $query = "INSERT INTO person_address VALUES('$person_id', '$address_id')";
    mysql_query($query) or die(mysql_error());  
}

答案 1 :(得分:0)

你不能在引号内使用这样的数组值 - 相反,你可以使用点分隔查询中的值。

$query = "SELECT age FROM person WHERE name='".$array[0]."' AND lastname='".$array[1]."' AND city='".$array[2]."'";

答案 2 :(得分:0)

第二个和第四个查询在值

的末尾没有结尾')'