我遇到了一个保存查询的奇怪问题,我想更好地了解如何解决它。
我有一个包含2个表的数据库,例如:
TBL_PERSON
person_id
person_name
person_telephone
TBL_ADDRESS
address_id
address_person_id
address_address
address_city
address_zip
现在,我使用这样的查询来存储记录:
$sqlQuery = "INSERT INTO TBL_PERSON (
person_name,
person_telephone
) VALUES (
'$person_name',
'$person_telephone'
)";
$result = MYSQL_QUERY($sqlQuery);
//Get last id
$address_person_id = mysql_insert_id();
$sqlQuery = "INSERT INTO TBL_ADDRESS (
address_person_id,
address_address,
address_city,
address_zip
) VALUES (
'$address_person_id',
'$address_address',
'$address_city',
'$address_zip'
)";
$result = MYSQL_QUERY($sqlQuery);
有时,TBL_ADDRESS
上没有添加任何记录。
在用户按下Insert
后,Action Button
,Name
和Telephone
存储在TBL_PERSON
上,但未存储在TBL_ADDRESS
上。
答案 0 :(得分:0)
除了discussion on the use of deprecated an insecure mysql_*
functions之外,我认为这是解释调试问题的方法的好机会。
在mysql_ *查询函数的替换中,会在错误上引发异常,允许您将查询包装在try
/ catch
块中并相应地处理它。在mysql_query()
的情况下,您只需从函数返回false
。因此,为了能够调试并因此发现错误,您需要执行以下操作(from the PHP manual):
$result = mysql_query('SELECT * FROM myTable');
if (!$result) {
die('Invalid query: ' . mysql_error());
}
如果您的查询失败,您会看到为什么,这在调试中非常重要。
如评论中所述,您不会转义任何值。除了您根本不应该使用这些功能(请参阅mysqli或PDO)之外,您至少应使用mysql_real_escape_string()
方法转义您的值:< / p>
$value = mysql_real_escape_string($value);
如果您遵循上述逻辑,您将看到导致该问题的原因,并且我怀疑使用正确的值转义来成功修复它。如果它不是值,则可能是数据库架构设计存在问题,例如不可为空且没有默认值的列,但您可能传递空值。