PDA

Показать полную графическую версию : [решено] не работает UPDATE-запрос


Surround
29-06-2011, 17:30
Добры день! Возникла странная ситуация! В скрипте собирается запрос:

class MysqlDB
{
private $mysql_link;
public function __construct()
{
$this->mysql_link = mysql_connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD) or die('Невозможно подключиться: ' . mysql_error());
mysql_select_db(MYSQL_DATABASE) or die (mysql_error());
mysql_query("SET SQL_MODE='STRICT_TRANS_TABLES'");//включение ограничей во FK
mysql_query("SET NAMES cp1251");
}

public function Query($sql)
{
$result = mysql_query($sql) or die(sprintf("<b>DB ERROR</b><br>%d: %s<br><b>IN QUERY</b><br>%s",mysql_errno(),mysql_error(),$sql));
return $result;
}


public function __destruct()
{
mysql_close($this->mysql_link);
}
}

function NVC($value)
{
if ($value!='') $value = "'$value'";
else $value = "NULL";
return htmlspecialchars($value, ENT_QUOTES);
}

$db = new MysqlDB();

$sql = "UPDATE abonents SET
abn_personal_acc = ".NVC($_POST["PerconalAcc"]).",
abn_contract_num = ".NVC($_POST["ConractNum"]).",
abn_login = ".NVC($_POST["Login"]).",
abn_passwd = ".NVC($_POST["Password"]).",
abn_lastname = ".NVC($_POST["Lastname"]).",
abn_name = ".NVC($_POST["Name"]).",
abn_fathername = ".NVC($_POST["Fathername"]).",
abn_passport_sn = ".NVC($_POST["PassportSn"]).",
abn_passport_data = ".NVC($_POST["PassportData"]).",
abn_born_date = ".NVC($Birthday).",
abn_born_place = ".NVC($_POST["BornPlace"]).",
abn_contact_phone = ".NVC($_POST["Phone"]).",
abn_city_id = '".$_POST["City"]."',
abn_street_id = '".$_POST["Street"]."',
abn_building_num = ".NVC($_POST["BuildingNum"]).",
abn_office_num = ".NVC($_POST["OfficeNum"])."
WHERE id = '".$_POST["AbonentId"]."'";
$db->Query($sql);

и при выполнении объект класса БД экранирует ошибку:
DB ERROR
1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2011-06-17', acp_comment = NULL WHERE id = '661' AND ac' at line 10
IN QUERY
UPDATE abn_cnct_points SET acp_port_id = '2262', acp_vlan = NULL, acp_ip = NULL, acp_tarif_id = '1', acp_city_id = '2', acp_street_id = '568', acp_building_num = NULL, acp_office_num = NULL, acp_start_date = '2011-06-17', acp_comment = NULL WHERE id = '661' AND acp_ab_id = '661'

Однако же если этот запрос дополдлинно скопировать и выполнить в phpMyAdmin, например, никаких ошибок нет и все исполняется.
В какую сторону копать, уже с толку сбился, подскажите, пожалуйста!

еще дополнение: если этот самый запрос вставить в переменную $sql в скрипте, все также срабатывает!

Sham
29-06-2011, 18:14
есть ограничения при разных SQL_MODE на значение полей. rtm (http://dev.mysql.com/doc/refman/5.6/en/server-sql-mode.html#sqlmode_strict_trans_tables).

мб дату в таком виде в поле нельзя совать (в таком значении SQL_MODE), зависит от формата поля в таблице... пробуйте сначала закоментить строку с SQL_MODE (если обновится, то значит ограничения режима).

Surround
30-06-2011, 09:00
не, дату как раз можно, это ж формат SQL, и запрос из PMA работает.
Разобрался в чем проблема - в экранировании кавычек htmlspecialchars. Запрос отправлялся с кавычками в виде html-сущностей, а в браузере выводился он же, но только эти сущности выглядели нормально. Заглянул в исходный код страницы и увидел следующее (нижние подчеркивание вставлено в данном случае, чтобы код не преобразовывался в символ): UPDATE abn_cnct_points SET acp_port_id = &_#39; 2262 &_#39;
Спасибо!




© OSzone.net 2001-2012