2012-07-04 3 views
-1

У меня есть этот sql-запрос, и мне нужно добавить временную метку в поле с именем «created» в предыдущей функции, которая обновляется. Я добавил $sqlMod = sprintf("UPDATE %s SET last_modified=now(), %s WHERE id='%s'", $table, $implodeArray, $_POST['id']);, который работает отлично. Однако я не могу заставить этот синтаксис правильно вставить в функцию, чтобы он работал правильно. Я пробовал (created, %s) VALUES ("now(), %s") ... и он не работает.timestamp для вставки в php

$sql = sprintf('INSERT INTO %s (%s) VALUES ("%s")', $table, implode(', ', array_map('mysql_escape_string', array_keys($values))), implode('", "',array_map('mysql_escape_string', $values))); 

В настоящее время: INSERT INTO projects (created, project_name, project_bold, project_content, id) VALUES ("now(), something", "something", "something", "46919705")

+0

Не используйте 'mysql_escape_string()'. Вместо этого используйте более исчерпывающий 'mysql_real_escape_string()'. В конечном итоге подумайте о переходе на API, поддерживающий подготовленные операторы, такие как MySQLi или PDO, хотя вам все равно необходимо объединить имена таблиц для динамического SQL, такие как это. –

+0

'implode (',', array_map ('mysql_escape_string', array_keys ($ values)))' неверно. –

+0

Проекты INSERT INTO (созданные, project_name, project_bold, project_content, id) VALUES («now(), something», «something», «something», «46919705») – Alex

ответ

1

Вызов NOW() не должен быть внутри кавычек, но приведенные ниже аргументы должны быть указаны.

(created, %s) VALUES (now(), "%s") 

Не использовать mysql_escape_string(). Используйте вместо этого более полный mysql_real_escape_string(). В конечном счете, подумайте о переходе на API, поддерживающий подготовленные операторы, такие как MySQLi или PDO, хотя вам все равно необходимо объединиться в именах таблиц для динамического SQL, например, вы делаете.

Хотя MySQL поддерживает двойные кавычки, одинарные кавычки для строковых значений являются немного более стандартными. Поменяйте цитируемости.Читатель на вашу строку и implode() вызова, так что конечный продукт выглядит следующим образом:

$sql = sprintf("INSERT INTO %s (created, %s) VALUES (NOW(), '%s')", $table, implode(', ', array_map('mysql_real_escape_string', array_keys($values))), implode("', '",array_map('mysql_real_escape_string', $values))); 

В последний момент на безопасность для вас и для будущих читателей, мы не видим истоки $table, но если это исходит из любого пользовательского ввода, рекомендуется проверить его значение на белый список допустимых имен таблиц, так как он не может быть надлежащим образом защищен mysql_real_escape_string().

+0

отлично! спасибо человеку;) и да, я должен заглянуть в sqli. Я имею в виду его в основном то же самое, что и функции, которые у меня есть в конце ...? или я ужасно ошибаюсь. Я знаю, что у них есть функции безопасности. и таблица не определяется предыдущей функцией. btw – Alex

+0

@Alex. Создание такого оператора с динамическим набором столбцов и значений может быть сложным с помощью подготовленных операторов, но они быстрее для циклов вставки, и вам не нужно беспокоиться об экранировании (но вы все равно должны быть осторожны с табличными переменными) –

0

Вы, кажется, положить все аргументы в одну строку - это не будет работать, потому что каждый аргумент должен быть отдельным юридическим лицом.

Вместо этого вы можете использовать только TIMESTAMP DEFAULT CURRENT_TIMESTAMP, и пусть база данных разместит для вас время создания.

+0

сценарий вставки отлично работает. im просто пытается правильно добавить созданное поле и не работает с внешними скриптами, а не с phpMyadmin из моего опыт. – Alex

0

Удалить created из вашего массива $values и жестко закодировал его в вашей строке SQL.

$sql = sprintf('INSERT INTO %s (%s, created) VALUES ("%s", now())', $table, implode(', ', array_map('mysql_escape_string', array_keys($values))), implode('", "',array_map('mysql_escape_string', $values))); 
Смежные вопросы