part_no
имеет следующий формат: 000-00000-00
для всех записей.
Мне нужно извлечь пять средних символов из part_no
и поместить их в core
столбец при создании записи.
Я не могу заставить свой скрипт работать.
Я не получаю никаких ошибок. Просто не работает.
$order = "INSERT INTO cartons_added (add_time, type, part_no, add_type, add_qty, add_ref, add_by, add_notes) VALUES ('$date', '$_POST[type]', '$_POST[part_no]', '$_POST[add_type]', '$_POST[add_qty]', '$_POST[add_ref]', '$_POST[add_by]', '$_POST[add_notes]')"; $result = mysql_query($order); $query2 = "select part_no from cartons_current"; $sel = mysql_query($query2); $res = mysql_result($sel); while($row = mysql_fetch_row($res)) { $core_digits = split('-',$row[0]); $core =$core_digits[1]; $query3 = "insert into cartons_current(core) values($core)"; $sel2 = mysql_query($query3); }
Вы правы, сценарий не имеет ошибки.
Я думаю, что проблема заключается в вашем SQL, который заставил вас не вставлять новую строку, особенно в структуру таблицы. Возможно, вы определили PRIMARY KEY
без AUTO_INCREMENT
, определили ключ INDEX
или UNIQUE
который не является core
ключом, или есть другой ключ, который не имеет значения по умолчанию. Помните, что вы не можете вставить строку без определения всего необходимого поля.
Вы, скрипт, выбираете все part_no
и для каждого part_no
вы вставляете новую строку в ту же таблицу, поэтому, возможно, есть проблема.
Я думаю, что вы хотите обновить каждый результат, чтобы добавить их core
ценность, вы можете сделать это с помощью UPDATE
качестве этого кода:
function getValue($value) { return "'" . trim(mysql_real_escape_string($value)) . "'"; } mysql_query('INSERT INTO `cartons_added` (`add_time`, `type`, `part_no`, `add_type`, `add_qty`, `add_ref`, `add_by`, `add_notes`) VALUES (' . getValue($date) . ', ' . getValue($_POST[type]) . ', ' . getValue($_POST[part_no]) . ', ' . getValue($_POST[add_type]) . ', ' . getValue($_POST[add_qty]) . ', ' . getValue($_POST[add_ref]) . ', ' . getValue($_POST[add_by]) . ', ' . getValue($_POST[add_notes]) . ')'); $partNoQuery = mysql_query('SELECT `part_no` FROM `cartons_current`'); while($partNoResult = mysql_fetch_assoc($partNoQuery)) { list($prefix, $core, $suffix) = explode('-', $partNoResult['part_no']); mysql_query('UPDATE cartons_current SET `core` = \'' . $core . '\' WHERE `part_no` = \'' . $partNoResult['part_no'] . '\''); }
Я добавил функцию getValue, чтобы избежать опубликованных данных, чтобы предотвратить SQL-инъекцию.
Вы можете обновить таблицу cartons_current
на основе вашей таблицы cartons_added
с чем-то вроде:
INSERT INTO cartons_current(core) SELECT SUBSTR(part_no, 5, 5) FROM cartons_added
Вероятно, вы захотите ограничить это WHERE
или, возможно, иметь дело с тем, что происходит, когда это значение уже находится в cartons_current
(используйте либо INSERT IGNORE
либо ON DUPLICATE KEY UPDATE
)
Попробуйте удалить это
$res = mysql_result($sel);
И измените свое while
чтобы ссылаться на основной ресурс запроса
while($row = mysql_fetch_row($sel)) {
Однако я не понимаю вашу логику с вашими таблицами. Вы вставляете данные в таблицу cartons_added
но затем вы выбираете из cartons_current
?
Кроме того, split
устарел с PHP 5.3.0
Вы сказали пять средних «персонажей», поэтому я бы добавил цитаты вокруг вашей переменной так:
$query3 = "insert into cartons_current(core) values('$core')";
(Кроме того, есть только около gazillion ответы на SO о SQL-инъекции и использование pdo)
INSERT INTO cartons_current(core) SELECT substr(part_no,position('-' IN part_no)+1,position('-' IN substr(part_no,position('-' IN part_no)+1))-1) FROM cartons_added;