php 5.6에서 mariadb 10.1에 삽입 일부 행을 삽입하지 않음
어제부터 어렵게 푸는 시험 대본에 이상한 문제가 생겼습니다.
내 php 스크립트는 다음과 같이 작동합니다.각각 10개 정도의 필드가 있는 1000개 정도의 항목이 있는 xml 파일을 가지고 있습니다.xml을 읽고 mysqli로 각 필드를 탈출하여 miaadb 10.1에 일괄 삽입하는 php 스크립트를 실행합니다(현재 하나씩 실행).
재밌는 것은 960열 정도는 문제없이 삽입이 되는데 20~30열 정도는 삽입이 안 되고 여기에 문제가 있다는 것입니다.
삽입되지 않는다고 말하면 스크립트를 실행한 후 몇 분 후에도 php myadmin(또는 명령줄)으로 이동하여 해당 행(ID별 쿼리, 고유 필드, 이름 등)을 전혀 찾을 수 없습니다.
질의를 출력해서 phphmyadmin으로 삽입하면 문제없이 들어갑니다.
그러나 php를 통해 삽입하면 삽입된 것으로 표시되고 id(오류 없음)도 반환됩니다.
printf ("New Record has id %d.\n", $mysqli->insert_id);
그래서 나는 id를 잡고, php my admin으로 이동하고, 그 id로는 아무것도 없습니다(하지만 자동 증가가 증가했습니다).
더 우스운 것은 제가 pph에 id로 질의하면 결과가 나타난다는 것입니다.모든 행을 선택하면 목록에 없습니다(또한 php에 있음).
그래서 내가 id로 선택할 때 행들이 php에 있지만, 그 id는 명령줄이나 phphmyadmin을 통해서는 존재하지 않습니다.
그 기록들 중 일부는 결국 몇 분 안에 나타나지만, 대부분은 몇 시간이 지나도 여전히 phpmyadmin에 표시되지 않습니다.
내 삽입물 중 일부는 대기열에 들어가고, 일부는 삽입되어 폐기되고, 다른 일부는 문제없이 들어가는 것 같습니다.
이것은 내가 읽지 않은 php 또는 mariadb 10.1의 새로운 기능 또는 버그입니까?
이것을 좀 더 디버그해 보겠지만, 여기 몇 가지 코드가 있습니다.
# use dom and xpath
$xml = simplexml_load_file($tmp);
if(is_object($xml)) { echo "XML is an object...<br />"; }
foreach ($xml->job as $r) {
if(isset($r->uid)) {
# filter data
$uid = $mysqli->real_escape_string(trim($r->uid));
$date = $mysqli->real_escape_string(date('Y-m-d H:i:s'));
$title = $mysqli->real_escape_string(trim($r->title));
$descr = $mysqli->real_escape_string(trim($r->descr));
$company = $mysqli->real_escape_string(trim($r->company));
$loc = $mysqli->real_escape_string(trim($r->loc));
$contact = $mysqli->real_escape_string(trim($r->contact));
$jobs[$uid] = "('$uid', '$date', '$title', '$descr', '$company', '$loc', '$contact')";
echo "<br />Found item: $uid / <b>$title</b>";
}
}
# insert in chunks of 10 (also tried REPLACE INTO with same results)
if(count($jobs) > '0') {
echo '<br />Inserting data...<br />';
$chunks = array_chunk($jobs, 10); foreach ($chunks as $chunk) { $insert = implode(", ", $chunk);
$result = $mysqli->query("INSERT INTO core_jobs_tmp (uid, date, title, descr, company, loc, contact) VALUES $insert");
$nid = $mysqli->insert_id;
printf ("New Record has id %d.\n", $mysqli->insert_id);
# check if it's there (debug: usually it's returns the result correctly)
$sql = $mysqli->query("SELECT * FROM core_jobs_tmp WHERE id = '$nid'");
if (mysqli_num_rows($sql) > '0') { while($r = mysqli_fetch_array($sql)) { echo '<br />'.$r['title'].'<br />'; } }
}
}
php에서 insert가 작동하지 않는 2개 항목이 포함된 xml 샘플:
<?xml version='1.0' encoding='UTF-8'?>
<ads>
<job>
<url><![CDATA[someurlhere]]></url>
<uid><![CDATA[42f4505cdb6c637777e7cdfd2ab9f354]]></uid>
<company><![CDATA[Empregos Work]]></company>
<site><![CDATA[indeed.com.br]]></site>
<country><![CDATA[br]]></country>
<date><![CDATA[2016-01-30]]></date>
<loc><![CDATA[Rio de Janeiro, RJ]]></loc>
<title><![CDATA[Assistente Administrativo Júnior]]></title>
<descr><![CDATA[Empresa:
Apenas usuários logados
Cargo:
Assistente Administrativo Júnior
Nível do cargo:
Nível Operacional
Contrato:
Temporário
Sexo:
Indiferente
Quantidade:
Salário:
R$ 970,00
Cidade:
RIO DE JANEIRO
Local de Trabalho:
não disponível
Benefícios:
Vale transporte
Requer Experiencia em:
Experiência anterior na área administrava e atendimento ao cliente
Formação Academica:
Ensino Médio Completo
Competências /
Características Pessoais: OBS: Oportunidade Temporária 3 meses
Atividades:
Atendimento ao cliente, conferência de documentos e lançamento de dados no sistema próprio da empresa.
Disponibilidade para viagens:
É necessário ter carro próprio:]]></descr>
<contact><![CDATA[someurlhere]]></contact>
</job>
<job>
<url><![CDATA[someurlhere]]></url>
<uid><![CDATA[02b5af5d2cc279890aae6f12db7003df]]></uid>
<company><![CDATA[Empregos Work]]></company>
<site><![CDATA[indeed.com.br]]></site>
<country><![CDATA[br]]></country>
<date><![CDATA[2016-01-30]]></date>
<loc><![CDATA[Rio de Janeiro, RJ]]></loc>
<title><![CDATA[Assistente Comercial]]></title>
<descr><![CDATA[Empresa:
Apenas usuários logados
Cargo:
Assistente Comercial
Nível do cargo:
Nível Operacional
Contrato:
Efetivo
Sexo:
Indiferente
Quantidade:
Salário:
R$ 2.300,00
Cidade:
RIO DE JANEIRO
Local de Trabalho:
não disponível
Benefícios:
Vale transporte, vale refeição, plano de saúde e odontológico.
Requer Experiencia em:
Experiência anterior na função.
Formação Academica:
Possuir ensino superior completo ou em andamento
Atividades:
Venda interna e externa de serviços.
Disponibilidade para viagens:
É necessário ter carro próprio:]]></descr>
<contact><![CDATA[someurlhere]]></contact>
</job>
</ads>
테이블 구조:
CREATE TABLE IF NOT EXISTS `core_jobs_tmp` (
`id` int(11) NOT NULL,
`uid` varchar(64) NOT NULL,
`date` datetime NOT NULL,
`title` varchar(128) NOT NULL DEFAULT '',
`descr` mediumtext NOT NULL,
`company` varchar(128) NOT NULL,
`loc` varchar(128) NOT NULL,
`state` varchar(128) NOT NULL,
`city` varchar(128) NOT NULL,
`contact` varchar(255) NOT NULL,
`paid` int(2) unsigned NOT NULL DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ALTER TABLE `core_jobs_tmp`
ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `uid` (`uid`), ADD KEY `date` (`date`), ADD KEY `paid` (`paid`), ADD FULLTEXT KEY `title` (`title`,`descr`,`company`,`loc`);
ALTER TABLE `core_jobs_tmp`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1;
그리고 내 mariadb config:
[mysql]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld]
user = mysql
default-storage-engine = InnoDB
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
bind-address = 127.0.0.1
character-set-server = utf8
collation-server = utf8_general_ci
# MyISAM #
key-buffer-size = 8M
myisam-recover-options = FORCE,BACKUP
# SAFETY #
max-allowed-packet = 32M
max-connect-errors = 1000000000
explicit_defaults_for_timestamp = 1
# DATA STORAGE #
basedir = /usr
tmpdir = /tmp
datadir = /var/lib/mysql/
# BINARY LOGGING #
log-bin = /var/lib/mysql/mysql-bin
expire-logs-days = 7
sync-binlog = 1
# CACHES AND LIMITS #
tmp-table-size = 128M
max-heap-table-size = 128M
query-cache-type = 0
query-cache-size = 0
max-connections = 1024
thread-cache-size = 1024
wait_timeout = 3600
open-files-limit = 65535
table-definition-cache = 4096
table-open-cache = 4096
# INNODB #
innodb_thread_concurrency = 0
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 384M
innodb-flush-log-at-trx-commit = 0
innodb-file-per-table = 1
innodb-buffer-pool-size = 1800M
# LOGGING #
log-error = /var/log/mysql/mysql-error.log
long_query_time = 2
log-queries-not-using-indexes = 0
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
# Fine Tuning #
thread_stack = 256K
ft_min_word_len = 3
[mysqldump]
quick
quote-names
max_allowed_packet = 512M
일부 서버 정보:
Server version: 10.1.10-MariaDB-1~jessie-log - mariadb.org binary distribution
Server charset: UTF-8 Unicode (utf8)
Database client version: libmysql - 5.6.24
PHP extension: mysqli
phpMyAdmin Version information: 4.2.12deb2+deb8u1
php -v PHP 5.6.14-0+deb8u1 (cli) (built: Oct 4 2015 16:13:10)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
사실은 제가 해결했습니다.데이터베이스 또는 설치가 어떻게든 손상되었습니다.mariadb 10.0의 다른 데이터베이스 서버에 데이터베이스를 덤프했는데 작동하고 있었습니다.그래서 mariadb 10.1을 제거하고 다시 설치했는데 내 sql이 mariadb 10.1에서 mariadb 10.1로 다시 덤프해서 지금 작동합니다.이상한 문제지만 효과가 있었습니다.
언급URL : https://stackoverflow.com/questions/35101174/insert-from-php-5-6-into-mariadb-10-1-not-inserting-some-rows
'programing' 카테고리의 다른 글
| 부모 구성 요소의 angular2 호출 함수 (0) | 2023.09.11 |
|---|---|
| Postgre와 동등한 MySQL은 무엇입니까?SQL의 설명 분석 (0) | 2023.09.11 |
| CSS 호버 이벤트에서 다른 디브의 스타일링을 변경할 수 있습니까? (0) | 2023.09.06 |
| jQuery bind to Paste Event, 붙여넣기 내용을 가져오는 방법 (0) | 2023.09.06 |
| C에 스왑 기능이 내장되어 있습니까? (0) | 2023.09.06 |