2014-11-21 2 views
1

Я искал, чтобы создать очень простую базу данных, которая имеет 4 столбца. Во-первых, это локальный int, который является автоматическим, 2-й - это идентификатор ID с одной цифрой, третий - другой INT, а четвертый - измененная переменная (строка). Проблема, которую я имею, однако, заключается в фактической вставке трех переменных.Вставить сломанную переменную в таблицу mysql с php

У меня есть $charIDs переменное увеличение на 1 в конце цикла for, которое используется в URL-адресе я соскабливаю. переменная $server является просто статическим int, а переменная $trimmedName - это фактический текст, который я царапаю с каждой веб-страницы, и он отлично работает.

for($i = 1; $i <= 5; $i++){ 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://website.com/asddas/asda/search?=$charIDs"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$content = curl_exec($ch); 

$dom = new DOMDocument(); 
$dom->loadHTML($content); 

$xpath = new DOMXPath($dom); 

$tags = $xpath->query('//*[@id="div_contents"]/div[2]/div[2]/div[2]/div[1]/dl/dd/span/text()'); 
foreach ($tags as $tag) { 
    trim($name = $tag->nodeValue); 
} 
if ($name != null){ 

$trimmedName = trim($name); 

$conn = new mysqli($servername, $username, $password, $dbname); 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "INSERT INTO players (serverID, charID, charName) 
VALUES ('$server', '$charIDs', '$trimmedName')"; 

$conn->close(); 
$name = null; 
$trimmedName = null; 
} 
$charIDs++; 
} 

Я проверил переменные, имена таблиц и т. Д., И я не уверен, почему он не работает. Я могу вставлять строки вручную в базу данных.

+0

У вас возникли ошибки? Было бы также полезно увидеть схему таблиц «игроков». вставьте результаты 'desc players' в вопрос. – robbmj

+0

'$ ch = curl_init();' следует перемещать за пределы цикла – Yang

ответ

2

Вот некоторые вещи, которые я заметил о своем сценарии.

1) Вы не выполняете запрос, это большая проблема.
2) Вы все равно должны использовать параметризованные запросы.
3) Зачем нужно воссоздавать объекты mysqli и statement на каждой итерации.

$conn = new mysqli($servername, $username, $password, $dbname); 

if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "INSERT INTO players (serverID, charID, charName) VALUES (?,?,?)"; 
$stmt = $conn->prepare($sql); 

if (!$stmt) { 
    die('could not create statement: ' . $conn->error); 
} 

for($i = 1; $i <= 5; $i++){ 
    // curl and XML stuff here 
    $binded = $stmt->bind_param('iis', $server, $charIDs, $trimmedName); 
    if ($binded) { 
     echo ($stmt->execute() ? 'Inserted' : 'Did not insert'); 
    } 
    $charIDs++; 
} 

$conn->close(); 
+0

Да, вы правы. Я чувствую себя полным идиотом, не замечая. Я скопировал весь код базы данных из сценария, который я написал около месяца назад, и делал это всю ночь. У меня была информация о подключении за пределами цикла for, я думаю, что я не смог это записать. Большое спасибо за вашу помощь. Это будет проходить несколько сотен тысяч раз. Переписанный вами код, по-вашему, ускорит его? В настоящее время он добавляет около 10 строк в секунду. – Cyanocobalamin

+0

Я бы переместил 'curl_init' вызов из цикла, а также. Но для запуска цикла сто тысяч потребуется немного времени. Curl имеет асинхронный режим, но я никогда не использовал его. Эта страница может помочь вам. http://stackoverflow.com/questions/12839793/asynchronous-curl-using-post – robbmj

+0

Хорошо, я посмотрю. Я перевешу его до цикла и посмотрю, поможет ли это кому-либо. – Cyanocobalamin

1

Это кажется довольно очевидным, но я не вижу нигде, где вы выполняете инструкцию SQL. Я не могу прокомментировать, насколько это безопасно, поскольку вы не предоставляете то, что содержит переменные. Надеюсь, вы включение best practices для данных

$sql = "INSERT INTO players (serverID, charID, charName) 
VALUES ('$server', '$charIDs', '$trimmedName')"; 
$conn->query($sql); 
Смежные вопросы